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');
}
相关推荐
程序员老刘3 小时前
跑分第一的编程大模型,我为啥不用?
flutter·ai编程·vibecoding
恋猫de小郭17 小时前
苹果 AirPods 协议,Android 也可以使用完整版 AirPods 能力
android·前端·flutter
张风捷特烈18 小时前
Flutter 类库大揭秘#01 | path_provider架构与设计
android·flutter
恋猫de小郭3 天前
Android 限制侧载新进展,谷歌联合国内厂商推验证计划
android·前端·flutter
恋猫de小郭3 天前
解读 Android 17 全新内存限制,有没有“豁免”后门?
android·前端·flutter
程序员老刘6 天前
跨平台开发地图 | 2026年6月
flutter·ai编程·客户端
悟空瞎说6 天前
Flutter 架构详解:新手必懂底层原理
flutter
SoaringHeart7 天前
Flutter最佳实践:IM聊天文字链接自动识别跳转
前端·flutter
恋猫de小郭7 天前
KMP / CMP 鸿蒙版本 Beta 发布,他有什么特别之处?
android·前端·flutter
风华圆舞8 天前
Flutter + 鸿蒙 Intents Kit:页面直达能力的完整接入方案
flutter·ui·华为·harmonyos