我最近开始学习Flutter和FlutterFire插件。昨天我正在与 firebase_database插件,可将Firebase实时数据库添加到Flutter。在尝试一个 简单地读取数据库,我注意到firebase_database提供的Streams之一onChildAdded中发生了一些奇怪的行为。
所以我的问题是,当我将onChildAdded流与StreamBuilder一起使用时,它仅返回一个最新的子级。当我过去使用Java使用Firebase数据库时,为DatabaseReference的每个子项(而不是最新的子项)调用了onChildAdded方法。 (假设onChildAdded在Java和Dart中提供相同的行为)
我还应该提到,当我使用onValue流时,一切正常,并且我得到了DatabaseReference的所有子级。
这是我的Firebase数据库的外观:
使用onChildAdded的代码
Widget _getBody(BuildContext context) {
final DatabaseReference databaseRef = FirebaseDatabase.instance.reference();
return StreamBuilder(
stream: databaseRef.child("notes").child('android').onChildAdded,
builder: (BuildContext context, AsyncSnapshot<Event> snapshot) {
if (snapshot.hasData) {
Map<dynamic, dynamic> notes = snapshot.data.snapshot.value;
notes.forEach(
(key, value) {
print(notes[key]);
}
);
}
return Container(); //Just a blank widget because builder has to return a widget
},
);
}
onChildAdded的输出:
使用onValue的代码
Widget _getBody(BuildContext context) {
final DatabaseReference databaseRef = FirebaseDatabase.instance.reference();
return StreamBuilder(
stream: databaseRef.child("notes").child('android').onValue,
builder: (BuildContext context, AsyncSnapshot<Event> snapshot) {
if (snapshot.hasData) {
List<dynamic> notes = snapshot.data.snapshot.value;
notes.forEach(
(item) {
print("$item \n");
}
);
}
return Container(); //Just a placeholder because builder has to return a widget
},
);
}
onValue的输出:
所以我希望有一种方法可以使用onChildAdded流获取所有子级。任何帮助表示赞赏!