Flutter登出崩溃:Null check operator used on a null value报错求助
报错信息
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,彻底摆脱对页面上下文的依赖:
- 在App入口定义全局key:
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
- 绑定到MaterialApp:
MaterialApp( navigatorKey: navigatorKey, // 其他配置项 )
- 修改
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

