多次打开含GoogleMaps组件的页面时App触发NullPointerException崩溃
解决多次打开Google Maps页面崩溃的问题
问题根源
你当前的代码存在两个核心问题:
- 错误地手动调用了
googleMapController?.dispose(),而GoogleMap组件本身会自动管理控制器的生命周期,重复释放会引发崩溃; - 使用的
custom_info_window: ^1.0.1版本存在控制器生命周期管理的bug,加上dispose顺序不合理,导致多次打开页面后出现内存泄漏或悬空引用。
修复方案
1. 修正dispose逻辑,移除重复释放
不要手动释放GoogleMapController,调整dispose顺序并确保先清理CustomInfoWindow的资源:
@override void dispose() { // 先关闭信息窗口,避免异步回调触发已释放的资源 _customInfoWindowController.hideInfoWindow?.call(); // 释放CustomInfoWindow控制器 _customInfoWindowController.dispose(); // 不要手动dispose googleMapController,GoogleMap组件会自行处理 super.dispose(); }
2. 移除无效的延迟代码
你添加的Future.delayed(const Duration(milliseconds: 1000), () {});是空回调,对解决问题毫无帮助,还可能干扰页面生命周期,直接删除即可。
3. 升级custom_info_window插件
1.0.1版本存在已知的内存泄漏和控制器管理问题,建议升级到最新稳定版(如2.x系列),新版本修复了大量生命周期相关的bug。
4. 优化控制器引用管理
给GoogleMapController单独添加变量持有,避免悬空引用:
// 新增单独的地图控制器变量 GoogleMapController? _mapController; @override void dispose() { _customInfoWindowController.hideInfoWindow?.call(); // 清空CustomInfoWindow持有的地图控制器引用 _customInfoWindowController.googleMapController = null; _customInfoWindowController.dispose(); _mapController = null; super.dispose(); } // 在onMapCreated中赋值 GoogleMap( onMapCreated: (GoogleMapController controller) async { _mapController = controller; _customInfoWindowController.googleMapController = controller; }, // 其他参数保持不变 )
内容的提问来源于stack exchange,提问作者Prashant Singh
相关产品推荐
相关产品推荐

