Я пытаюсь заполнить ListView.builder данными из нескольких узлов из моего экземпляра базы данных Firebase Realtime.
Мне интересно прослушивать изменения на узле chats
(и обновлять представление списка, когда они встречаются), но меньше интересуются обновлениями в реальном времени на узле chats-details
.
chats
-- 'chat1'
---- 'keyA' : 'This is some text'
---- 'keyB' : 'This is some text'
-- 'chat2'
---- 'keyA' : 'This is some text'
---- 'keyB' : 'This is some text'
chats-details
-- 'chat1'
---- 'keyC' : 'This is some text'
---- 'keyD' : 'This is some text'
-- 'chat2'
---- 'keyC' : 'This is some text'
---- 'keyD' : 'This is some text'
В идеале все данные для chat1, chat2 ... et c должны быть добавлены к объекту (myChats
в примере ниже) и переданы в ListView.
Любой Помощь будет принята с благодарностью. Мой текущий код ниже. Этот код в настоящее время не заполняет автоматически ListView.
// Node 1 - Listen to changes
chatsRef = FirebaseDatabase().reference().child('chats');
// Node 2 - Update when node 1 is updated
chatsDetailsRef = FirebaseDatabase().reference().child('chats-details');
@override
Widget build(BuildContext context) {
List<Chats> myChats = [];
return Scaffold(
appBar: AppBar(),
body: StreamBuilder(
stream: chatsRef.onValue,
builder: (context, snap) {
if (snap.hasData && !snap.hasError && snap.data.snapshot.value != null) {
Map data = snap.data.snapshot.value;
data.forEach((index, data) {
chatsDetailsRef.child(index).once().then((DataSnapshot snapshot) {
Chats currentChat = Chats.fromMap(data);
if (snapshot.value == null) {
Chat emptyChatDetails = Chat();
currentChat.chatDetails = emptyChatDetails;
} else {
Chat foundChatDetails = ChatDetails.fromMap(snapshot.value);
currentChat.chatDetails = foundChatDetails;
}
myChats.add(currentChat);
});
});
return ListView.builder(
itemCount: myChats.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(myChats[index].title),
subtitle: Text(myChats[index].chatDetails.detail),
);
},
);
} else {
return Center(child: Text("No data"));
}
},
),
);
}
}