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

Flutter登出崩溃:Null check operator used on a null value报错求助

Flutter登出操作崩溃:空值检查运算符异常解决方法

报错信息

E/flutter (12659): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Null check operator used on a null value
E/flutter (12659): #0 StatefulElement.state
package:flutter/…/widgets/framework.dart:4999
E/flutter (12659): #1 Navigator.of
package:flutter/…/widgets/navigator.dart:2543
E/flutter (12659): #2 Navigator.pushReplacement
package:flutter/…/widgets/navigator.dart:2105
E/flutter (12659): #3 MainCoordinator.logoutNavigation
package:domicilios/…/MainCoordinator/MainCoordinator.dart:62
E/flutter (12659): #4 UserActions.signOut.<anonymous closure>.<anonymous closure>
package:domicilios/…/View/ProfileTab.dart:222
E/flutter (12659): <asynchronous suspension>

问题分析

异常根源是调用Navigator.pushReplacement时,传入的context已失效(比如当前ProfileTab页面在异步操作完成前被销毁),导致Navigator.of无法获取有效状态,触发空值检查异常。

解决方案

方案1:检查State挂载状态

在执行导航前,判断当前页面State是否仍处于挂载状态,避免使用失效上下文:

extension UserActions on _ProfileTabState {
  void signOut(BuildContext context) {
    AlertView.showAlertDialog(
        model: AlertViewModel(
            context,
            const AssetImage('assets/logout.png'),
            'Cierre de sesión en curso',
            "¿Desear salir de la sesión actual?",
            'Cerrar sesión',
            "Cancelar", () {
      _profileTabViewModel
          .signOut()
          .then((value) {
            // 确认页面未被销毁再执行导航
            if(mounted) {
              coordinator.logoutNavigation(context: context);
            }
          });
    }, () {
      Navigator.pop(context);
    }));
  }
}

方案2:使用全局NavigatorKey

通过全局key获取Navigator,彻底摆脱对页面上下文的依赖:

  1. 在App入口定义全局key:
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
  1. 绑定到MaterialApp:
MaterialApp(
  navigatorKey: navigatorKey,
  // 其他配置项
)
  1. 修改logoutNavigation方法:
void logoutNavigation() {
  navigatorKey.currentState?.pushReplacement(/* 你的登录页路由 */);
}

方案3:获取根Navigator

如果必须使用上下文,可获取根Navigator避免页面上下文失效问题:

// 修改MainCoordinator中的logoutNavigation方法
void logoutNavigation({required BuildContext context}) {
  Navigator.of(context, rootNavigator: true).pushReplacement(/* 你的登录页路由 */);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:15:30