Flutter Firebase异步查询未在流函数中检索数据

Posted

技术标签:

【中文标题】Flutter Firebase异步查询未在流函数中检索数据【英文标题】:Flutter Firebase async query not retrieving data inside a stream function 【发布时间】: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();
    );


  

【问题讨论】:

【参考方案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;类型。查看我更新的答案和建议。

以上是关于Flutter Firebase异步查询未在流函数中检索数据的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:关于检索 Firebase 用户 ID 的异步函数的问题

带有 Firebase 云消息传递的 Flutter 2.0:onMessage 未在 Android 上调用

Flutter firebase setData()函数在完成异步函数之前将空值分配给字段

Flutter Firebase:Firebase 中的数据更新,但未在屏幕上自动显示计数器更新

来自 Flutter App 的 Firebase Id Token 未在 REST 服务器上验证

Flutter List 未在异步方法之外更新