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

Flutter修改代码报!_debugLocked is not true错误如何解决?

问题根因

!_debugLocked is not true 报错的核心原因是你在组件的build方法执行过程中直接调用了Navigator导航操作,此时Flutter正处于组件树渲染的锁定状态,不允许执行修改导航栈、更新状态这类操作,热重载时会重新触发build逻辑,因此每次修改代码都会触发报错,必须重启应用才能恢复。

代码存在的具体问题
  1. 自动登录的导航逻辑直接写在build方法中,且auth.currentUser()是异步方法,你没有加await就直接判断返回值,判断逻辑完全失效
  2. 你写的Future.delayed(Duration(seconds: 3))没有加await,延迟逻辑根本不会生效,代码会直接执行导航操作,刚好撞上组件渲染的锁定周期
  3. 登录成功的判断逻辑写反:if (user == null)才跳转,实际应该是user != null时才说明登录成功
  4. 登录失败场景没有隐藏加载框,会导致加载框一直悬浮在页面上
修复方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:39:03