【问题标题】:Flutter Firebase async query not retrieving data inside a stream functionFlutter Firebase异步查询未在流函数中检索数据
【发布时间】:2021-12-14 22:05:50
【问题描述】:

我正在尝试在另一个查询中从 firebase 查询用户,但由于某种原因,我无法让代码正常工作

不会运行的函数是await usersRef.doc(uid).get();,可以在这里找到:

static getUserData(String uid) async {
    return await usersRef.doc(uid).get();
  }

  static  DirectMessageListModel getDocData(QueryDocumentSnapshot qdoc, String uid)  {
    Userdata postUser = Userdata.fromDoc(getUserData(uid));
    return DirectMessageListModel.fromDoc(qdoc, postUser);
  }

  static DirectMessageListModel fromDoc(QueryDocumentSnapshot doc, Userdata altUser) {
    return DirectMessageListModel(
      doc['chatId'],
      doc['lastMsgContent'],
        doc['lastMsgType'],
        altUser
    );
  }

父函数:

Stream<List<DirectMessageListModel>> getMeassageList(){
    var snaps = FirebaseFirestore.instance.collection('directMessages').where('users', arrayContains: userdata!.uid).snapshots();
    List<String> usersListElement = [];

    return snaps.map((event) { return event.docs.map((e) {
      usersListElement = [e.get('users')[0], e.get('users')[1]];
      usersListElement.remove(userdata!.uid);
      return DirectMessageListModel.getDocData(e, usersListElement.first);
    }).toList();
    });


  }

【问题讨论】:

    标签: firebase flutter google-cloud-firestore stream-builder flutter-streambuilder


    【解决方案1】:

    您忘记等待未来的getUserData(uid) 完成。

    试试这个:

    static Future<DocumentSnapshot<Object>> getUserData(String uid) async {
      return await usersRef.doc(uid).get();
    }
    
    static DirectMessageListModel getDocData(
      QueryDocumentSnapshot qdoc,
      String uid,
    ) async {
      Userdata postUser = Userdata.fromDoc(await getUserData(uid)); // await here
      return DirectMessageListModel.fromDoc(qdoc, postUser);
    }
    
    ..
    // parent function.
    // Also wait for the future in the parent function.
    
    // UPDATE BELOW! Define the parent function like this:
    Stream<List<Future<DirectMessageListModel>>> getMeassageList() {
      var snaps = FirebaseFirestore.instance
          .collection('directMessages')
          .where('users', arrayContains: userdata!.uid)
          .snapshots();
      List<String> usersListElement = [];
    
      return snaps.map((event) {
        return event.docs.map((e) async {
          usersListElement = [e.get('users')[0], e.get('users')[1]];
          usersListElement.remove(userdata!.uid);
          return await DirectMessageListModel.getDocData(e, usersListElement.first);
        }).toList();
      });
    }
    

    注意:您正在为directMessages 集合中的每条消息获取用户数据(发送者/接收者)。在directMessages 集合中仅存储发件人/收件人名称并简单地显示它可能会更好。然后,如果用户点击一条消息,您就可以获取完整的发送方/接收方数据。

    【讨论】:

    • 当我尝试使父函数异步时,我收到错误:“返回类型 'List>' 不是 'List',如闭包的上下文。”知道为什么吗?
    • 是的,DirectMessageListModel.getDocData返回的数据是一个future,所以parent必须返回一个List&lt;Future&gt;类型。查看我更新的答案和建议。
    猜你喜欢
    • 2017-01-11
    • 2016-02-16
    • 2019-04-01
    • 1970-01-01
    • 2020-07-07
    • 2021-03-27
    • 2020-01-15
    • 2016-02-16
    • 1970-01-01
    相关资源
    最近更新 更多