Flutter中调用controller.animateCamera时如何避免触发onCameraIdle?
解决Flutter Google Map点击列表项时误触发onCameraIdle的问题
核心思路是通过一个标记变量区分用户主动拖动地图和代码触发的相机移动,只在用户拖动时执行更新请求:
- 在你的State类中添加一个布尔变量:
bool _isUserInitiatedMove = false;
- 修改GoogleMap组件,新增
onCameraMoveStarted回调标记用户操作:
GoogleMap( mapType: MapType.normal, markers: Set.of(positionsList), onMapCreated: (GoogleMapController controller) { if (!_mapController.isCompleted) { _mapController.complete(controller); } }, onCameraMoveStarted: () { // 用户开始拖动地图时标记为主动操作 _isUserInitiatedMove = true; }, onCameraIdle: () { // 仅当用户主动拖动时才执行更新 if (_isUserInitiatedMove) { postRequestToUpdatePositionsList(); } // 重置标记,避免影响后续操作 _isUserInitiatedMove = false; }, );
- 修改ListView的点击事件,提前标记为非用户主动操作:
onTap: () { // 标记为代码触发的相机移动,避免onCameraIdle执行更新 _isUserInitiatedMove = false; CameraPosition cameraPos = CameraPosition(target: nowPosition, zoom: defaultZoom); controller.animateCamera(CameraUpdate.newCameraPosition(cameraPos)); }
这样调整后,只有用户手动拖动地图导致相机停止时,才会调用postRequestToUpdatePositionsList();点击列表项触发的相机移动结束后,不会触发该更新逻辑。
内容的提问来源于stack exchange,提问作者l4ru3
相关产品推荐
相关产品推荐

