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

Flutter使用Get框架退出含Google Map页面时触发Late初始化异常

问题:Get框架中使用Get.offAll时触发LateInitializationError异常

当前基于Get框架开发,map_controller.dart控制器代码如下:

final Completer<GoogleMapController> mapController = Completer();
late final GoogleMapController gmcontroller;

控制器的初始化与销毁逻辑:

@override
void onInit() async {
  super.onInit();
  gmcontroller = await mapController.future;
}

@override
void onClose() async {
  gmcontroller.dispose();
  super.onClose();
}

页面包含带用户位置标记的Google Map,以及一个退出按钮,点击按钮执行:

Get.offAll(() => const LoginPage());

异常情况:
点击按钮时抛出异常:

LateError (LateInitializationError: Field 'gmcontroller' has not been initialized.)

改用Get.off替换Get.offAll则无此问题。


原因分析

Get.offAll会清空整个路由栈并销毁所有关联的控制器,若用户在地图加载完成前(即mapController.future还未完成、gmcontroller未初始化)点击退出,onClose方法中调用gmcontroller.dispose()就会触发未初始化错误。而Get.off仅替换当前路由,控制器销毁时机不同,不会触发该问题。


解决方案

方案1:使用可空类型替代late声明(推荐)

将gmcontroller改为可空类型,利用Dart空安全避免未初始化调用:

// 替换原late声明
GoogleMapController? gmcontroller;

@override
void onInit() async {
  super.onInit();
  gmcontroller = await mapController.future;
}

@override
void onClose() async {
  // 使用空安全调用,未初始化时自动跳过
  gmcontroller?.dispose();
  super.onClose();
}

方案2:在onClose中捕获异常

保留late声明,用try-catch包裹dispose调用,忽略未初始化的错误:

@override
void onClose() async {
  try {
    gmcontroller.dispose();
  } catch (_) {
    // 忽略未初始化导致的异常
  }
  super.onClose();
}

内容的提问来源于stack exchange,提问作者WatsMyName

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:17:27