Flutter Navigator 锁定错误

导航跳转时提示报错

Assertion failed: >file:///D:/sdk/flutter/packages/flutter/lib/src/widgets/navigator.dart:4536:12 !_debugLocked is not true

报错原因:

Navigator 内部在处理一次导航(比如 pushpop)时,会将其锁定(_debugLocked = true),直到该导航操作完成。

你看到这个错误说明:

在正在执行 pushpoppushReplacement 等操作期间,又触发了新的导航请求。

例如,可能触发这个报错情形

build() 过程中触发导航

scss 复制代码
dart
@override
Widget build(BuildContext context) {
  Navigator.pushNamed(context, '/home'); // ❌ 错误:build 过程中导航
  return Container();
}
perl 复制代码
dart
onPressed: () {
  Navigator.pop(context); // 弹窗关闭
  Navigator.pushNamed(context, '/next'); // ❌ 同步立即 push,会报错
}

解决方法

使用 Future.microtask / WidgetsBinding.instance.addPostFrameCallback

推迟导航操作,等当前帧绘制完毕:

ini 复制代码
dart
WidgetsBinding.instance.addPostFrameCallback((_) {
  Navigator.pushNamed(context, '/home');
});

或者:

ini 复制代码
dart
Future.microtask(() {
  Navigator.pushNamed(context, '/home');
});

await 弹窗关闭之后再导航

dart 复制代码
dart
onPressed: () async {
  Navigator.pop(context); // 关闭弹窗
  await Future.delayed(Duration(milliseconds: 300)); // 等一会儿再导航
  Navigator.pushNamed(context, '/next');
}
相关推荐
jiushiapwojdap10 小时前
Flutter上手记:为什么我的按钮能同时在iOS和Android上跳舞?[特殊字符][特殊字符]
android·其他·flutter·ios
木子雨廷13 小时前
Flutter 局部刷新小组件汇总
前端·flutter
恋猫de小郭16 小时前
iOS 26 正式版即将发布,Flutter 完成全新 devicectl + lldb 的 Debug JIT 运行支持
android·前端·flutter
君赏18 小时前
Petrel(雨燕)Flutter 热更新如何在我们项目应用
flutter
JulyYu20 小时前
Flutter混合栈适配安卓ActivityResult
android·flutter
海的天空16611 天前
Flutter旧版本升级-> Android 配置、iOS配置
android·flutter·ios
小蜜蜂嗡嗡1 天前
【flutter对屏幕底部有手势区域(如:一条横杠)导致出现重叠遮挡】
前端·javascript·flutter
ai_xiaogui1 天前
反催收APP开发思路:用Flutter打造证据链管理工具
flutter·反催收app开发·flutter证据链管理·跨平台维权工具
木子雨廷2 天前
Flutter 开发一个plugin
前端·flutter
苦逼的搬砖工2 天前
Network Kit Lite:一个基于 SOLID 原则的 Flutter 网络框架架构设计
flutter