Flutter修改代码报!_debugLocked is not true错误如何解决?
问题根因
!_debugLocked is not true 报错的核心原因是你在组件的build方法执行过程中直接调用了Navigator导航操作,此时Flutter正处于组件树渲染的锁定状态,不允许执行修改导航栈、更新状态这类操作,热重载时会重新触发build逻辑,因此每次修改代码都会触发报错,必须重启应用才能恢复。
代码存在的具体问题
- 自动登录的导航逻辑直接写在
build方法中,且auth.currentUser()是异步方法,你没有加await就直接判断返回值,判断逻辑完全失效 - 你写的
Future.delayed(Duration(seconds: 3))没有加await,延迟逻辑根本不会生效,代码会直接执行导航操作,刚好撞上组件渲染的锁定周期 - 登录成功的判断逻辑写反:
if (user == null)才跳转,实际应该是user != null时才说明登录成功 - 登录失败场景没有隐藏加载框,会导致加载框一直悬浮在页面上
修复方案
1. 移除build方法中的自动登录逻辑,将其迁移到initState生命周期中
使用WidgetsBinding.instance.addPostFrameCallback确保导航操作在当前帧渲染完成后再执行,避开渲染锁定周期,同时修正异步调用逻辑:
@override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) async { FirebaseUser? user = await auth.currentUser(); if (user != null) { await Future.delayed(const Duration(seconds: 3)); if (mounted) { Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => HomeScreen(userEmail: user.email ?? '',))); } } }); }
2. 修正登录按钮的点击逻辑
onPressed: () async { progressDialog.show(); try { AuthResult authResult = await FirebaseAuth.instance.signInWithEmailAndPassword( email: email.trim(), password: password.trim() ); FirebaseUser? user = authResult.user; progressDialog.hide(); if (user != null) { print("logged in"); if (mounted) { Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => HomeScreen(userEmail: user.email ?? '',))); } } } catch (e) { progressDialog.hide(); print(e.toString()); } },
注意事项
- 不要在
build方法中执行导航、setState这类修改状态/导航栈的操作,build方法只负责返回渲染的组件 - 异步操作完成后调用
context前,要先判断mounted是否为true,避免页面销毁后调用上下文引发的报错 - 调用异步方法必须加
await,否则逻辑不会按预期顺序执行
内容的提问来源于stack exchange,提问作者GeorTheDev
相关产品推荐
相关产品推荐

