You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多次打开含GoogleMaps组件的页面时App触发NullPointerException崩溃

解决多次打开Google Maps页面崩溃的问题

问题根源

你当前的代码存在两个核心问题:

  1. 错误地手动调用了googleMapController?.dispose(),而GoogleMap组件本身会自动管理控制器的生命周期,重复释放会引发崩溃;
  2. 使用的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:13:03