flutter_map如何不删除重建Marker即可修改其位置
问题原因
Marker类的point属性被final修饰,属于不可变属性,实例化后无法直接修改赋值,所以你直接修改_markers[0].point的写法会触发编译错误。
解决方案
你不需要全量重绘所有Marker,只要按如下步骤修改即可,Flutter自带的Diff算法会自动识别仅修改的单个Marker,其余Marker会被复用不会重建:
- 先修正
_markers的类型声明,避免类型安全问题
// 原代码:late List _markers; late List<Marker> _markers;
- 改写
changeMarkerPos方法,替换对应位置的Marker实例,保留原有唯一Key和其他属性,仅修改point值,最后调用setState触发更新
void changeMarkerPos() { final oldMarker = _markers[0]; // 仅替换point属性,其余属性全部复用旧Marker的配置 _markers[0] = Marker( key: oldMarker.key, width: oldMarker.width, height: oldMarker.height, builder: oldMarker.builder, point: LatLng(_random.nextDouble() * 10 + 48, _random.nextDouble() * 10 - 6), ); setState(() {}); }
性能说明
因为你已经为每个Marker设置了唯一的ValueKey,Flutter在更新Marker列表时,会通过Key对比前后的组件差异,只有你修改的那个Marker会被重绘,其余Marker的状态(比如你代码里的随机颜色)都会被保留,不会重新生成,完全符合你仅修改单个Marker位置的需求。
内容的提问来源于stack exchange,提问作者paulksi
相关产品推荐
相关产品推荐

