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
集合中仅存储发件人/收件人名称并简单地显示它可能会更好。然后,如果用户点击一条消息,您就可以获取完整的发送方/接收方数据。
【讨论】:
当我尝试使父函数异步时,我收到错误:“返回类型 'ListDirectMessageListModel.getDocData
返回的数据是一个future,所以parent必须返回一个List<Future>
类型。查看我更新的答案和建议。以上是关于Flutter Firebase异步查询未在流函数中检索数据的主要内容,如果未能解决你的问题,请参考以下文章
Flutter:关于检索 Firebase 用户 ID 的异步函数的问题
带有 Firebase 云消息传递的 Flutter 2.0:onMessage 未在 Android 上调用
Flutter firebase setData()函数在完成异步函数之前将空值分配给字段
Flutter Firebase:Firebase 中的数据更新,但未在屏幕上自动显示计数器更新