【问题标题】:Mapping Firestore stream and sub-collection映射 Firestore 流和子集合
【发布时间】:2021-05-22 03:10:05
【问题描述】:

我在网上找到了一些类似的解决方案,但我无法让它与我的代码一起使用。

我认为问题出在 async/await 和 forEach 循环上,但我无法修复它。基本上,下面的代码不会将用户添加到 usersList 中,而是会相应地打印每个 if 块的调试行。

  Stream<List<AppUser>> showSuggestionStream() {
    List<AppUser> usersList = [];

    return _firestore.collection('users').snapshots().map((snap) {
      snap.docs.forEach((u) async {
        final user = u.data();

        final friendsCollection =
            await u.reference.collection('friends').doc(uid).get();

        if (friendsCollection.exists) {
          if (friendsCollection.data()['status'] == 'accepted') {
            print(
                'FriendsCollection exist and we are friends, no need to add to usersList');
          } else {
            print('FriendsCollection exist and we are not friends');
            usersList.add(AppUser(
              uid: u.id,
              displayName: user['name'],
              email: user['email'],
              photoUrl: user['photoUrl'],
              phoneNumber: user['phoneNumber'],
              providerData: user['providerData'],
            ));
          }
        } else {
          print('No friends collection');
          usersList.add(AppUser(
            uid: u.id,
            displayName: user['name'],
            email: user['email'],
            photoUrl: user['photoUrl'],
            phoneNumber: user['phoneNumber'],
            providerData: user['providerData'],
          ));
        }
      });

      return usersList.toList();
    });
  }

编辑:

我考虑了更多,并决定尝试不同的方式。我正在远离 async/await,希望这是正确的方式。

但仍然无法让朋友的子集工作。我不确定如何将Future&lt;List&lt;Friend&gt;&gt; 转换为List&lt;Friend&gt;

  Stream<List<AppUser>> searchUsersStream() {
    return _firestore
        .collection('users')
        .snapshots()
        .map((snap) => snap.docs
            .map((doc) => AppUser(
                  uid: doc.id,
                  displayName: doc.data()['name'],
                  email: doc.data()['email'],
                  phoneNumber: doc.data()['phoneNumber'],
                  photoUrl: doc.data()['photoUrl'],
                  providerData: doc.data()['providerData'],
                  // friends: doc.reference
                  //     .collection('friends')
                  //     .doc(uid)
                  //     .snapshots()
                  //     .map((doc) => Friend(userId: doc.id, name: doc.name))
                  //     .toList()
                ))
            .toList());
  }

【问题讨论】:

  • “我认为问题在于 async/await 和 forEach 循环” - 将 snap.docs.forEach(...) 替换为“正常”for (var doc in snap.docs) {...,以及使用的 map 方法是什么因为它的回调总是返回usersList.toList()?
  • 谢谢@pskink,但是当我尝试更改为“正常”时,我必须将异步移动到这一行:_firestore.collection('users').snapshots().map((snap) async {。然后我得到错误:参数类型'Future> Function(QuerySnapshot)' 不能分配给参数类型'List Function(QuerySnapshot)'。跨度>
  • @pskink 用于map 方法,这是第一次,我这样尝试,因为我在网上看到一些代码可以做到这一点。我应该删除地图方法吗?我对 Flutter/dart 还是很陌生。
  • 这就是我问map的原因——你需要两个for循环,外部:for (var snap in _firestore.collection('users').snapshots())和内部:for (var doc in snap.docs)
  • 从不Iterable.forEachasync 回调一起使用。见[dart]flutter how to wait map.forEach to complete in Future<void> function?

标签: firebase flutter dart google-cloud-firestore


【解决方案1】:
List<AppUser> usersList = new List();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    相关资源
    最近更新 更多