Home > front end >  Handling Firebase Stream Object in Flutter
Handling Firebase Stream Object in Flutter

Time:03-06

I'm trying to receive Data from the Firebase Realtime Database in Flutter. I can't get it working - all the solutions I found so far don't work.

The connection to the database is working and getting Data:

String userid = FirebaseAuth.instance.currentUser!.uid;
DatabaseReference _database =FirebaseDatabase.instance.ref();

void _getData(){

  _itemStream = _database.child('users/$userid/items/').onValue.listen((event) {
  final Object? mydata = event.snapshot.value;


  print(mydata.toString());

});
}

This gives me my set of Data as an Object. The Print-Statement returns this, which is the correct Dataset for the node:

{1646396962722: {mhd: 2022-03-04 12:29:22.722218, name: Hund, startdate: 2022-03-04 12:29:22.722106, fach: 0}, 1646396401456: {mhd: 2022-03-04 12:20:01.461668, name: Hund, startdate: 2022-03-04 12:20:01.456343, fach: 0}, 1646396946311: {mhd: 2022-03-04 12:29:06.312466, name: Maus,  startdate: 2022-03-04 12:29:06.311793, fach: 0}}

The problem I can't solve is: How to Loop through this Dataset and get it into a List in Dart. If I try something like

mydata?.forEach()

I get the Error:

The method 'forEach' isn't defined for the type 'Object'.

Im really stuck. Maybe anyone can give me a tip how to approach this.

Thanks!

CodePudding user response:

If you look at your dataset, this is in fact a Map<dynamic, dynamic>. You need to convert this to a better Dart object or use the for in loop. see the example below:

main() {
// in your example 
//  final Map<dynamic, dynamic>? mydata = event.snapshot.value;
  final Map<dynamic, dynamic> yourMap = {
    '1646396962722': {
      'mhd': '2022-03-04 12:29:22.722218',
      'name': 'Hund',
      'startdate': '2022-03-04 12:29:22.722106',
      'fach': '0'
    },
    '1646396401456': {
      'mhd': '2022-03-04 12:20:01.461668',
      'name': 'Hund',
      'startdate': '2022-03-04 12:20:01.456343',
      'fach': '0'
    },
    '1646396946311': {
      'mhd': '2022-03-04 12:29:06.312466',
      'name': 'Maus',
      'startdate': '2022-03-04 12:29:06.311793',
      'fach': '0'
    }
  };

  for (final entry in yourMap.entries) {
    print('key: ${entry.key}, value: ${entry.value}');
  }
}
//key: 1646396962722, value: {mhd: 2022-03-04 12:29:22.722218, name: Hund, startdate: 2022-03-04 12:29:22.722106, fach: 0}
//key: 1646396401456, value: {mhd: 2022-03-04 12:20:01.461668, name: Hund, startdate: 2022-03-04 12:20:01.456343, fach: 0}
//key: 1646396946311, value: {mhd: 2022-03-04 12:29:06.312466, name: Maus, startdate: 2022-03-04 12:29:06.311793, fach: 0}

CodePudding user response:

only sketchup code:

final List<dynamic> list = myData as List<dynamic>;
for(final dynamic item of list) {
final Map<String, dynamic> dataAsMap = item as Map<String, dynamic>
print(item.keys);
final Map<String, dynamic> actualObject = map[item.keys.first as String] as Map<String, dynamic>;
print(actualObject["name"]);
}
}
  • Related