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

Flutter Firebase async query not retrieving data inside a stream function

我正在尝试在另一个查询中从 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();
    });


  }

您忘记等待未来 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 集合中的每条消息获取用户数据(sender/receiver)。最好只在 directMessages 集合中存储 sender/receiver 名称并简单地显示它。然后,如果用户点击一条消息,您就可以获取完整的 sender/receiver 数据。