Заполнить Flutter ListView из нескольких узлов базы данных - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь заполнить 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"));
            }
          },
        ),
    );
  }
}

1 Ответ

1 голос
/ 10 января 2020

Вы пытались позвонить setState при каждом добавлении элементов в myChats?

setState(() {
    myChats.add(currentChat);
});

https://api.flutter.dev/flutter/widgets/State/setState.html

Кроме того, в настоящее время вы переопределяете myChats массив каждый раз при запуске функции сборки, то есть он очищает все чаты там всякий раз, когда виджет перестраивается. Если вы хотите, чтобы эти чаты остались, вы должны будете объявить этот массив как член самого класса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...