【问题标题】:Merging stream in flutter firetore在颤动的火库中合并流
【发布时间】:2021-08-09 10:03:57
【问题描述】:

我正在使用两个查询从 Firestore 中获取数据。

查询 1。

_firestore
      .collection('chats')
      .doc(getCurrentUser().uid)
      .collection('chatUsers')
      .orderBy('timestamp');

查询 1 中的所有查询快照文档。我正在获取最后一条消息和文档 ID,并在 listTile 中显示最后一条消息。使用文档 ID,我将传递 ID 以从其他集合中获取其他数据,例如姓名照片等。

查询 2。

 Future<DocumentSnapshot> fetchUserData(String uid) async => await _firestore
          .collection('users')
          .doc(uid).get();

所以为此我需要使用嵌套流构建器。第一个获取所有数据的流生成器​​。第二个流构建器,用于从所有数据中获取用户请求的数据。最好的方法是什么?

这就是我在我的小部件中为查询 2 使用查询 1 的方式,我必须在 ListView.builder 中实现它,这将是嵌套流。请用最好的方法指导我。

 SafeArea(
          child: Scaffold(
            body: StreamBuilder<QuerySnapshot>(
                stream: _fetchUserChatRoom.snapshots(),
                builder:
                    (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
                  if (snapshot.hasData) {
                    return _tiles(snapshot.data.docs);
                  } else if (snapshot.hasError) {
                    return Icon(Icons.error_outline);
                  } else {
                    return CircularProgressIndicator();
                  }
                }),
          ),
        );
      }
    
      Widget _tiles(List<QueryDocumentSnapshot> docs) {
        return ListView.builder(
            itemCount: docs.length,
            itemBuilder: (BuildContext context, int index) {
              var data = ChatModel.fromMap(docs[index].data());
              return GestureDetector(
                onTap: () => Navigator.of(context).push(MaterialPageRoute(
                    builder: (_) => ChatScreen(uid: docs[index].id))),
                child: ListTile(
                  leading: CircleAvatar(),
                  title: Text(data.message),
                  subtitle: Text(data.timestamp.toString()),
                  trailing: Text('time'),
                ),
              );
            });

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    您可以在您的 ListView.builder 中使用 asyncawait,但是,我认为这可能会降低您的应用程序速度并导致大量 Firestore 调用。

      Widget _tiles(List<QueryDocumentSnapshot> docs) {
        return ListView.builder(
            itemCount: docs.length,
            itemBuilder: (BuildContext context, int index) async {
              var data = ChatModel.fromMap(docs[index].data());
              var userData = await fetchUserData(data[index].uid);
              return GestureDetector(
                onTap: () => Navigator.of(context).push(MaterialPageRoute(
                    builder: (_) => ChatScreen(uid: docs[index].id))),
                child: ListTile(
                  leading: CircleAvatar(),
                  title: Text(data.message),
                  subtitle: Text(data.timestamp.toString()),
                  trailing: Text('time'),
                ),
              );
            });
    

    其他选项(我使用的)是对所有联系人使用 Provider 类。当应用程序使用您的 Firestore 中的所有用户初始化时,您可以填写 Provider。之后,您可以在应用中的任何位置使用每个用户数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-15
      • 2021-07-16
      • 1970-01-01
      • 2021-06-05
      • 2021-02-13
      • 2019-10-29
      • 1970-01-01
      • 2020-04-11
      相关资源
      最近更新 更多