我正在 Flutter/Dart 上构建一个应用程序,用户可以在其中发布帖子。每个帖子都是通过“userpost”小部件构建的,该小部件从名为“EventPosts”的 firestore 集合中获取信息(使用 Streambuilder 和 AsyncSnapshot
要从每个帖子中获取更多详细信息,可以单击其中一个,然后会出现一个名为“eventinfo”的新屏幕。此屏幕使用来自相同 AsyncSnapshot
在同一个提要上,有一个搜索功能,点击搜索按钮后会被调用。搜索函数创建同一个 firestore 集合的 searchSnapshot,并在参数“searchSnapshot”中返回它。基于该搜索快照,为每个搜索结果创建一个容器。意思是搜索帖子,例如“soccer”,所有名为“soccer”的帖子都会出现。
我想要的是,如果单击一个容器,屏幕“eventinfo”应以相同的布局出现,就好像它是通过提要中的“userpost”单击一样。屏幕“eventinfo”只接受 AsyncSnapshot
我尝试了几件事。首先,我想通过使用带有 onTap 函数的 InkWell 从搜索屏幕重定向到 eventinfo:
`
onTap: () {
Navigator.push(context, MaterialPageRoute(
builder: (context, ) => eventinfo(snap: searchSnapshot as AsyncSnapshot<QuerySnapshot<Map<String, dynamic>>>)));},`
//With the help of ChatGPT3 I tried to convert the searchSnapshot into a AsyncSnapshot<QuerySnapshot<Map<String, dynamic>>>, so I could call it like this:
onTap: () {
Navigator.push(context, MaterialPageRoute(
builder: (context, ) => eventinfo(snap: convertSearchSnapshot (searchSnapshot))));},
//The convertSearchSnapshot had different approaches:
Future<AsyncSnapshot<QuerySnapshot<Map<String, dynamic>>>> convertSearchSnapshot(QuerySnapshot searchSnapshot) async {
final snapshot = await AsyncSnapshot<QuerySnapshot<Map<String, dynamic>>>.withData(ConnectionState.done, searchSnapshot);
return snapshot;
}
convertSearchSnapshot (QuerySnapshot<Object?> searchSnapshot) {
final data = searchSnapshot.docs
.map((doc) => doc.data() as Map<String, dynamic>)
.toList();
return AsyncSnapshot<QuerySnapshot<Map<String, dynamic>>>.withData(
ConnectionState.done, QuerySnapshot<Map<String, dynamic>>(data: data));
}
AsyncSnapshot<QuerySnapshot<Map<String, dynamic>>> convertSearchSnapshot (QuerySnapshot<Object?> searchSnapshot) {
final data = searchSnapshot.docs.map<Map<String, dynamic>>((doc) => doc.data() as Map<String, dynamic>).toList();
final convertedQuerySnapshot = QuerySnapshot<Map<String, dynamic>>(docs: [], size: data.length, metadata: searchSnapshot.metadata);
for (var i = 0; i < data.length; i++) {
convertedQuerySnapshot.docs.add(QueryDocumentSnapshot<Map<String, dynamic>>(data: data[i], reference: searchSnapshot.docs[i].reference));
}
return AsyncSnapshot<QuerySnapshot<Map<String, dynamic>>>.withData(ConnectionState.done, convertedQuerySnapshot);
}
convertSearchSnapshot (QuerySnapshot searchSnapshot) {
QuerySnapshot<Map<String, dynamic>> querySnapshot = QuerySnapshot<Map<String, dynamic>>.fromSnapshot(searchSnapshot);
AsyncSnapshot<QuerySnapshot<Map<String, dynamic>>>
AsyncSnapshot<QuerySnapshot<Map<String, dynamic>>> asyncSnapshot = AsyncSnapshot<QuerySnapshot<Map<String, dynamic>>>.withData(ConnectionState.done, querySnapshot);
return asyncSnapshot;
}
convertSearchSnapshot (searchSnapshot) {
QuerySnapshot<Map<String, dynamic>> querySnapshot = QuerySnapshot<Map<String, dynamic>>.from(
searchSnapshot.data()!.docs.map((doc) => doc.data() as Map<String, dynamic>).toList(),
);
AsyncSnapshot<QuerySnapshot<Map<String, dynamic>>> asyncSnapshot = AsyncSnapshot<QuerySnapshot<Map<String, dynamic>>>.withData(ConnectionState.done, querySnapshot);
}
我假设由于几条错误消息,这不起作用..