Flutter获取Firebase指定文档时报NoSuchMethodError: 'docs'被空调用如何处理
问题修复方案
报错核心原因
你的报错除了目标文档不存在之外,还有两个代码逻辑问题:
- 仅判断了
snapshot.hasData,没有处理snapshot本身的请求错误状态,也没有判断查询返回的文档列表为空的情况 - 重复3次调用
singleWhere匹配目标用户文档,匹配不到时该方法会直接抛出未捕获的异常,同时用!强制声明data不为空,当数据为null时直接触发你遇到的报错
具体修改实现
你可以直接替换为下方代码,已经做了异常捕获、空判断、以及匹配不到文档时显示「不可用」提示的逻辑,同时优化了重复查询的性能问题:
StreamBuilder( stream: FirebaseFirestore.instance.collection('location').snapshots(), builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) { // 先判断请求异常状态 if (snapshot.hasError) { return const Center(child: Text("不可用")); } // 加载状态 if (!snapshot.hasData || snapshot.connectionState == ConnectionState.waiting) { return const Center(child: CircularProgressIndicator()); } // 查找匹配的用户文档,只查询一次复用结果 final docs = snapshot.data!.docs; final userDoc = docs.where((element) => element.id == widget.user_id).firstOrNull; // 没有匹配到文档的情况 if (userDoc == null) { return const Center(child: Text("不可用")); } // 读取经纬度 final latitude = userDoc['latitude'] as double; final longitude = userDoc['longitude'] as double; if (_added) { mymap(snapshot); } return GoogleMap( mapType: MapType.normal, markers: { Marker( position: LatLng(latitude, longitude), markerId: const MarkerId('id'), icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueMagenta) ), }, initialCameraPosition: CameraPosition( target: LatLng(latitude, longitude), zoom: 14.47 ), onMapCreated: (GoogleMapController controller) async { setState(() { _controller = controller; _added = true; }); }, ); }, )
兼容说明
如果你的项目Dart版本低于2.12,不支持firstOrNull语法,可以替换为如下写法完成匹配判断:
QueryDocumentSnapshot? userDoc; try { userDoc = docs.singleWhere((element) => element.id == widget.user_id); } catch (e) { userDoc = null; }
建议给经纬度字段也加空判断,避免字段缺失导致的类型转换异常。
内容的提问来源于stack exchange,提问作者Iqbal Rahat
相关产品推荐
相关产品推荐

