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

Flutter报错type 'Null'不是List<Marker>子类型问题排查求助

问题修复方案

报错根源

你遇到的type 'Null' is not a subtype of type 'List<Marker>' of 'function result'报错,是空安全类型不匹配导致的:

  • GoogleMap组件的markers属性要求传入非空的Set<Marker>类型
  • 页面首次渲染时,ApplicationBloc中的markers变量仅声明未初始化,默认值为null
  • 代码中直接用!强制对null值解包,触发类型校验报错

修复步骤

1. 修正ApplicationBloc中markers的声明

将ApplicationBloc类中markers的声明从可空延迟初始化,改为默认赋值为空的非空列表:

// 原代码
late List<Marker>? markers;
// 替换为
List<Marker> markers = [];

2. 修正主页面GoogleMap的markers传值

去掉强制解包符!,直接传入非空的markers列表:

// 原代码
markers: Set<Marker>.of(applicationBloc.markers!),
// 替换为
markers: Set<Marker>.of(applicationBloc.markers),

3. 修复initState中的空变量问题

你当前initState中声明的applicationBloc变量未赋值,后续调用会触发空报错,按如下修改:
首先修改verileriCagir方法,使其正确返回Bloc实例:

Future<Applicationbloc> verileriCagir()async{
  return Provider.of<Applicationbloc>(context,listen: false);
}

再修改initState逻辑,拿到实例后再绑定监听:

@override
void initState() {
  super.initState();
  verileriCagir().then((applicationBloc){
    locationSubscription= applicationBloc.selectedLocation.stream.listen((place) {
      if(place!=null){
        _goToPlace(place);
      }else{
        _locationController.text = "";
      }
    });
    boundsSubscription = applicationBloc.bounds.stream.listen((bounds) async{
      final GoogleMapController controller = await _mapController.future;
      controller.animateCamera(CameraUpdate.newLatLngBounds(bounds, 50.0));
    });
  });
}

4. 可选优化

后续togglePlaceType方法中对markers操作的强制解包符!都可以删掉,现在markers已经是非空变量,无需再做强制解包。


内容的提问来源于stack exchange,提问作者Ctnkaya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:09:03