You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter获取Firebase指定文档时报NoSuchMethodError: 'docs'被空调用如何处理

问题修复方案

报错核心原因

你的报错除了目标文档不存在之外,还有两个代码逻辑问题:

  1. 仅判断了snapshot.hasData,没有处理snapshot本身的请求错误状态,也没有判断查询返回的文档列表为空的情况
  2. 重复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:15:00