【问题标题】:The getter 'docs' isn't defined for the type 'AsyncSnapshot<Object?>'没有为类型 'AsyncSnapshot<Object?>' 定义 getter 'docs'
【发布时间】:2021-08-29 11:33:00
【问题描述】:

迁移到 null 安全后出现错误 getter 'docs' 没有为类型 'AsyncSnapshot' 定义。 尝试导入定义“docs”的库,将名称更正为现有 getter 的名称,或定义名为“docs”的 getter 或字段。

错误所在的代码 sn-p

    return FutureBuilder(
      future: searchResultsFuture,
      builder: (context, snapshot) {
        if (!snapshot.hasData) {
          return circularProgress();
        }
        List<UserResult> searchResults = [];
        snapshot.docs.forEach((doc) {    //have error here
          User user = User.fromDocument(doc);
          UserResult searchResult = UserResult(user);
          searchResults.add(searchResult);
        });
        return ListView(
          children: searchResults,
        );
      },
    );
  } 

搜索结果未来


  handleSearch(String query) {
    Future<QuerySnapshot> users =
        usersRef.where("displayName", isGreaterThanOrEqualTo: query).get();
    setState(() {
      searchResultsFuture = users;
    });
  }

  clearSearch() {
    searchController.clear();
  }

【问题讨论】:

  • “没有为类型 'AsyncSnapshot”定义 getter 'docs' - 是的,确实 AsyncSnapschot 没有名为 docs 的字段
  • 那么我该怎么做才能修复我的代码?
  • 使用AsyncSnapshot.data属性
  • @pskink 你能告诉我如何在这里使用AsyncSnapshot.data 属性
  • 如果你打电话给print(snapshot.data),你会看到什么?如果不是null,那么它有你的数据

标签: firebase flutter google-cloud-firestore flutter-futurebuilder


【解决方案1】:

代码中的snapshotAsyncSnapshot,它确实没有docs 子级。要从 Firestore 获取文档,您需要使用:

snapshot.data.docs

另请参阅listening for realtime data 上的 FlutterFire 文档,其中包含一个显示此内容的示例 - 以及我在此处解释所有快照类型的答案:What is the difference between existing types of snapshots in Firebase?

【讨论】:

  • 感谢您提供这些信息,但我仍然无法修复我的代码我对 Flutter 很陌生,对使用这些代码不太了解,我只是在尝试学习他们
  • 我收集了很多,这就是为什么我提供了两个链接,您可以在其中找到更深入的解释和更多示例代码。如果您在完成这些工作时遇到问题,请编辑您的问题,以显示您使用答案和链接中的信息/代码尝试过的内容。
【解决方案2】:

通常,检索数据需要几毫秒,所以我尝试了这个 确保在检索数据后执行我的操作

return StreamBuilder<QuerySnapshot>(
    stream: Collectionreference
        .snapshots(),
    builder: (BuildContext context,
        AsyncSnapshot<QuerySnapshot> activitySnapshot) {
      if (activitySnapshot.hasError) {
        return  Center(
              child: Text('Something went wrong'),
            );
      }
      if (activitySnapshot.connectionState == ConnectionState.waiting) {
        return Center(
                child: SpinKitWave(
              color: constants.AppMainColor,
              itemCount: 5,
              size: 40.0,
            )));
      }
      if (!activitySnapshot.hasData || activitySnapshot.data.docs.isEmpty) {
        return Center(
              child: Text('Nothing to Display here'),
            );
      }
      if (activitySnapshot.hasData) {
         activitySnapshot.data.docs.forEach(doc=>{
            print(doc);
          })
      }
     }
   });

【讨论】:

  • 试过了,但它并没有解决我的问题,仍然出现同样的错误,我只有在迁移到空安全后才开始出现这个错误
【解决方案3】:

像这样改变:

return FutureBuilder(
      future: searchResultsFuture,
      builder: (context, **AsyncSnapshot** snapshot) {
        if (!snapshot.hasData) {
          return circularProgress();
        }
        List<UserResult> searchResults = [];
        **snapshot.data!.docs.forEach((doc) {** 
          User user = User.fromDocument(doc);
          UserResult searchResult = UserResult(user);
          searchResults.add(searchResult);
        });
        return ListView(
          children: searchResults,
        );
      },
    );
  }

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2021-03-01
  • 2021-05-18
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 2020-09-02
  • 2021-07-23
  • 2022-10-09
相关资源
最近更新 更多