首页 > 解决方案 > 在 null 上调用了 getter 'document'。溪流文件没有被退回

问题描述

已定义Stream<QuerySnapshot>,我正在从类构造函数中调用 uid

Stream<QuerySnapshot> get hotels {
    // print("$uid in stream");

    return ownerCollection.document(uid).collection("hotels").snapshots();
  }

设置StreamProvider

class Hotels extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final user = Provider.of<User>(context);

    return StreamProvider<QuerySnapshot>.value(
      value: DatabaseService(uid: user.uid).hotels,
      child: Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.orangeAccent,
          title: Text("My Hotels"),
        ),
        body: HotelList())
      );

这是我正在访问的屏幕Stream<QuerySnapshot>

class HotelList extends StatefulWidget {
  @override
  _HotelListState createState() => _HotelListState();
}

class _HotelListState extends State<HotelList> {
  @override
  Widget build(BuildContext context) {

    final hotels = Provider.of<QuerySnapshot>(context);

    for(var doc in hotels.documents) {
      print(doc.data);
    }

     return Container();
  }
}

当我运行它时,它给了我错误:The getter 'documents' was called on null , Reciever : null

请帮忙,我想打印子集合“酒店”中的所有文件。

标签: firebaseflutterdartgoogle-cloud-firestore

解决方案


正如我在评论中所说,错误消息“X was called on null”意味着 X 不是 null,而是你调用它的任何内容。在您的情况下,这是问题代码:

final hotels = Provider.of<QuerySnapshot>(context);

for(var doc in hotels.documents) {
  print(doc.data);
}

错误是documents在 null 上调用,这意味着hotel为 null。这意味着您的提供程序获取无法正常工作。

我没有使用StreamProvider太多,但如果我不得不猜测这是因为第一次构建您的小部件时,源流尚未发布任何数据,这是有道理的,因为流的源是需要的在线服务是时候连接和收集数据了。这意味着没有QuerySnapshot返回,因此Provider.of返回 null。

通常你会通过给出StreamProvider一个初始值来解决这个问题。但是,由于类型是QuerySnapshot,我不确定除了 null 之外的有意义的初始值是什么。在这种情况下,您唯一真正的选择是只处理hotelnull 的情况。

final hotels = Provider.of<QuerySnapshot>(context);

if (hotels == null) {
  print('There is no data yet.');
  return Container();
}

...

推荐阅读