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
相关产品推荐
相关产品推荐

