Flutter调用Firebase时报错无法访问documents属性解决方案求助
问题原因
这个报错是Dart空安全机制和Cloud Firestore SDK版本更新两个原因共同导致的:
- StreamBuilder的
snapshot对象在流未返回数据时,snapshot.data为可空类型,直接无条件访问属性会触发空安全校验失败 - 新版本的
cloud_firestore依赖中,QuerySnapshot的列表属性已经从documents更名为docs,单条文档数据的获取也从.data属性改为调用.data()方法 - 你没有为StreamBuilder指定泛型,Dart无法推断
snapshot.data的具体类型,默认识别为Object?,自然无法访问对应属性
修复方案
第一步:先修正blogStream的类型定义
把原来的
Stream? blogStream;
改为
Stream<QuerySnapshot>? blogStream;
第二步:重写BlogsList方法中StreamBuilder的逻辑
完整修改后的BlogsList方法代码如下:
Widget BlogsList() { return Container( child: blogStream != null ? Column( children: <Widget>[ StreamBuilder<QuerySnapshot>( stream: blogStream, builder: (context, snapshot) { // 先处理加载状态 if (snapshot.connectionState == ConnectionState.waiting) { return const Center(child: CircularProgressIndicator()); } // 处理错误状态 if (snapshot.hasError) { return Center(child: Text('加载失败: ${snapshot.error}')); } // 确认有数据后再访问属性,此时snapshot.data一定非空,可以用!断言 final docList = snapshot.data!.docs; return ListView.builder( padding: const EdgeInsets.symmetric(horizontal: 15), itemCount: docList.length, shrinkWrap: true, itemBuilder: (context, index) { // 获取单条文档数据 Map<String, dynamic> docData = docList[index].data() as Map<String, dynamic>; return BlogsTile( imgUrl: docData['imgUrl'], author: docData['authorName'], title: docData['title'], desc: docData['desc'], ); }, ); }, ), ], ) : Container( alignment: Alignment.center, child: const CircularProgressIndicator(), ), ); }
额外说明
如果你用的是更老版本的cloud_firestore,还没适配新的docs属性,只需要在判断snapshot有数据之后,把访问documents的地方加上非空断言即可,也就是把snapshot.data.documents改成snapshot.data!.documents,但还是建议升级到最新版本的Firestore依赖使用新API。
内容的提问来源于stack exchange,提问作者Foozaweb
相关产品推荐
相关产品推荐

