0

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


  }
4

1 回答 1

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集合中并简单地显示它。然后,如果用户单击消息,您就可以获取完整的发送者/接收者数据。

于 2021-10-30T01:19:41.963 回答