Flutter初始化Marker集合时无法访问实例成员iconStation的问题求助
Flutter初始化Marker集合时无法访问实例成员iconStation的问题求助
嗨,我刚碰到过一模一样的坑,来给你捋清楚问题出在哪,以及怎么解决:
首先说问题根源:你直接把_chargingStationMarkers作为类级的final变量初始化了,但Dart里类的实例变量初始化器是在构造函数执行前就跑的,这时候你的iconStation还只是个late声明的空变量(毕竟getIcon是异步方法,要等widget初始化后调用才会给它赋值),自然没法在初始化器里访问它,这就是报错的原因。
下面是具体的解决步骤:
- 先把你的Marker集合改成
late final类型,先不初始化,等图标加载完成后再创建:
late final Set<Marker> _chargingStationMarkers;
- 修改你的
getIcon方法,在获取到图标后,顺便初始化Marker集合,然后通过setState更新:
void getIcon() async { var iconCar = await BitmapDescriptor.asset( const ImageConfiguration(devicePixelRatio: 3.2), "assets/mapicons/car.png", width: 40, height: 40, ); var iconStation = await BitmapDescriptor.asset( const ImageConfiguration(devicePixelRatio: 3.2), "assets/mapicons/charging-station.png", width: 40, height: 40, ); setState(() { this.iconCar = iconCar; this.iconStation = iconStation; // 在这里初始化Marker集合 _chargingStationMarkers = { Marker( markerId: const MarkerId('station-01'), icon: iconStation, position: ev01, ), // 其他需要的Marker都可以在这里添加 }; }); }
- 别忘了在
initState里调用getIcon,确保widget一启动就开始加载图标并创建Marker:
@override void initState() { super.initState(); getIcon(); }
- 额外小提示:为了避免在Marker集合还没初始化完成时,GoogleMap组件报错,可以给markers属性加个空判断兜底:
GoogleMap( markers: _chargingStationMarkers ?? {}, // 其他地图属性... )
简单来说,核心就是不要在同步的初始化器里依赖异步加载的实例成员,必须把依赖异步数据的逻辑放到异步方法里,等数据准备好后再通过setState更新变量和UI。
内容来源于stack exchange
相关产品推荐
相关产品推荐

