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
相关产品推荐
相关产品推荐

