我可以转换 QuerySnapshot<Object?> 吗?参数转换为 AsyncSnapshot<QuerySnapshot<Map<String, dynamic>>> 参数?

问题描述 投票:0回答:0

我正在 Flutter/Dart 上构建一个应用程序,用户可以在其中发布帖子。每个帖子都是通过“userpost”小部件构建的,该小部件从名为“EventPosts”的 firestore 集合中获取信息(使用 Streambuilder 和 AsyncSnapshot>> 参数)。每个帖子都显示在提要中。

要从每个帖子中获取更多详细信息,可以单击其中一个,然后会出现一个名为“eventinfo”的新屏幕。此屏幕使用来自相同 AsyncSnapshot>> 参数的信息构建自身,因为“userpost”正在调用“eventinfo”。

在同一个提要上,有一个搜索功能,点击搜索按钮后会被调用。搜索函数创建同一个 firestore 集合的 searchSnapshot,并在参数“searchSnapshot”中返回它。基于该搜索快照,为每个搜索结果创建一个容器。意思是搜索帖子,例如“soccer”,所有名为“soccer”的帖子都会出现。

我想要的是,如果单击一个容器,屏幕“eventinfo”应以相同的布局出现,就好像它是通过提要中的“userpost”单击一样。屏幕“eventinfo”只接受 AsyncSnapshot>> 参数。但是搜索功能返回一个 QuerySnapshot?争论。

我尝试了几件事。首先,我想通过使用带有 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);
  }    

我假设由于几条错误消息,这不起作用..

flutter dart snapshot
© www.soinside.com 2019 - 2024. All rights reserved.