颤振加载ListView项目异步

时间:2019-06-15 16:55:57

标签: android firebase flutter dart google-cloud-firestore

每个异步任务完成后,ListView项如何刷新?

我在Firebase上有2个需要访问的集合,如果有其他方法,请告知,因为我是Firebase和Flutter的新手。

我的users内部有一个名为favorites的集合,其中包含userID字段(与文档ID相同),我将所有用户数据BUT加载到ListView中,而仅将那些匹配该ID(以避免无缘无故地加载1000个用户= $$$)。

根据我的代码和在“运行”窗口上进行的测试,我得到了每个用户的值,但是我在应用程序上的ListView显示为空白。我试图设置一个setstate,但是应用程序不停地刷新。

我试图创建一个单独的函数,但简单地我无法返回文档快照列表。

谢谢

FutureBuilder(
              future: Firestore.instance.collection('users').document(id).collection('favorites').getDocuments(),
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  List<DocumentSnapshot> userDocs = [];
                  snapshot.data.documents.forEach((doc) async {
                    await Firestore.instance.collection('users').document(doc.documentID).get().then((user) {
                      userDocs.add(user);
                    });
                  });
                  return ListView(
                    children: userDocs.map((document) {
                      return buildItem(context, document);
                    }).toList(),
                  );
                }
              },
            ),

1 个答案:

答案 0 :(得分:0)

所以,经过数周的努力,我终于做到了。

  1. StreamBuilder仅获取收藏夹中的文档:

    stream: Firestore.instance.collection('u').document(id).collection('f').snapshots()

  2. ListView.Builder返回一个新的小部件(MessageTile状态小部件)

    return MessageTile(ctx: context, doc: snapshot.data.documents[index]);

  3. 在Statefull小部件内,我返回一个FutureBuilder<DocumentSnapshot>,它仅提取与userId匹配的用户:

    future: Firestore.instance.collection('u').document(doc['userId']).get()

简单吧? ..