Я тоже столкнулся с этой проблемой и обнаружил, что проще НЕ использовать виджет StreamBuilder.При использовании StreamBuilder мне пришлось использовать .onValue вместо .onChildAdded, чтобы вернуть все дочерние элементы, но .onValue вернул дочерние элементы в непредсказуемом порядке, потому что он возвращался как карта.
ВместоЯ думаю, что лучше всего создать StreamSubscription и вызвать ее в initState (), как показано ниже.Новые дочерние элементы добавляются в массив, а массив используется для построения ListView.Я вставляю новых дочерних элементов с индексом 0, чтобы новейшие записи находились в верхней части таблицы.
class NotificationsFeedPage extends StatefulWidget {
@override
_NotificationsFeedPageState createState() => _NotificationsFeedPageState();
}
class _NotificationsFeedPageState extends State<NotificationsFeedPage> {
List <Notification> notificationList = [];
StreamSubscription <Event> updates;
@override
void initState() {
// TODO: implement initState
super.initState();
updates = FirebaseDatabase.instance.reference().child('notifications').child(currentUser.uid).limitToLast(50).onChildAdded.listen((data) {
notificationList.insert(0, Notification.fromFireBase(data.snapshot));
setState(() {
});
} );
}
@override
void dispose() {
// TODO: implement dispose
updates.cancel();
super.dispose();
}
Где уведомление - это пользовательский класс следующим образом:
class Notification {
String name;
bool isComment;
String user;
String comment;
Notification.fromFireBase(DataSnapshot snapshot) {
this.name = snapshot.value["name"] ?? 'Unknown user';
this.isComment = snapshot.value["isComment"] ?? false;
this.user = snapshot.value["user"] ?? '';
this.comment = snapshot.value["comment"] ?? '';
}
}
Это продолжаетсяслушать до тех пор, пока представление не будет ликвидировано.Прослушивание прекращается при вызове updates.cancel ().