从ListView.builder-Flutter

时间:2018-08-30 16:14:59

标签: dart flutter

我正在使用ListView.builder构造函数通过从Firestore检索数据来构建列表。

我有两个集合,分别根据这些集合中的数据进行存储。

收藏信息:

  • 消息
    • message1
    • message2

邮件中的每个文档都有以下键:msgBody,发件人。 我将发件人ID存储在消息文档的发件人字段中,它实际上是集合Users中各个用户的文件名。

收藏用户:

  • 用户
    • 詹姆斯
    • greg

我当前正在使用下面的代码来读取消息集合并获取其中的文档,然后获取发件人字段中的值并创建对相应发件人文档的文​​档引用,并尝试使用“用户”获取发件人详细信息记录并使用列表中的数据。

child: StreamBuilder<QuerySnapshot>(
                      stream: Firestore.instance.collection('Messages').snapshots(),
                      builder: (BuildContext context, AsyncSnapshot snapshot) {
                        if (!snapshot.hasData) return Center(child: CircularProgressIndicator());
                          return new ListView.builder(
                          itemCount: snapshot.data.documents.length,
                          padding: const EdgeInsets.all(6.0),
                          itemBuilder: (context, index) {
                            DocumentSnapshot ds = snapshot.data.documents[index];  
                            DocumentReference tRef = Firestore.instance.document('/users/'+ds['sender']);
                            DocumentSnapshot tRefD;
                            tRef.get().then((tData){
                              print(tData.data); // I can see the sender data in the console here
                              tRefD = tData;
                            });

                             if (ds.data.isNotEmpty)
                             {
                              return Column(
                               children: <Widget>[
                                  Text(ds['sender']), 
                                  Text(tRefD['name']), //App crashes here works when I comment this line
                                ],
                              );
                           } 
                          }
          )

如何从不同集合下的不同文档中读取数据,并在同一ListView.builder中使用它们?

任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:1)

在获取用户名时,UI已经建立。每个文档都需要嵌套FutureBuilderStreamBuilder。或在单独的方法中进行async调用,在initState中调用此方法并填充相应的字段,然后将其加载到build方法内的UI中。