Flutter在initState跳转页面抛出“!_debugLocked': is not true”错误求助
这个问题我之前也碰到过!原因是initState执行的时候,你的LoadingScreen还没完全挂载到Widget树里,Flutter框架此时处于构建锁定状态(_debugLocked为true),不允许进行导航这类会改变Widget树的操作。下面给你两种简单有效的解决方法:
方法1:使用WidgetsBinding.instance.addPostFrameCallback
这个回调会在当前Widget的第一帧绘制完成后触发,此时Widget已经完全挂载到树中,导航操作就安全了。修改你的initState方法如下:
@override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) { Navigator.push(context, MaterialPageRoute(builder: (context)=>Home())); }); }
方法2:使用Future.delayed(Duration.zero)
这会把导航操作放到下一个事件循环执行,同样能避开当前的构建锁定状态,代码更简洁:
@override void initState() { super.initState(); Future.delayed(Duration.zero, () { Navigator.push(context, MaterialPageRoute(builder: (context)=>Home())); }); }
额外优化建议
如果你的LoadingScreen只是作为启动跳转页,推荐用Navigator.pushReplacement替代Navigator.push,这样加载页不会保留在导航栈中,用户返回时不会回到加载页,体验更合理:
// 替换成这个 Navigator.pushReplacement(context, MaterialPageRoute(builder: (context)=>Home()));
另外如果有初始化逻辑(比如加载数据),可以把跳转放在异步操作完成后,避免加载动画一闪而过的尴尬:
@override void initState() { super.initState(); _prepareAndNavigate(); } void _prepareAndNavigate() async { // 模拟异步初始化操作,比如加载本地配置或请求接口 await Future.delayed(const Duration(seconds: 1)); Navigator.pushReplacement(context, MaterialPageRoute(builder: (context)=>Home())); }
内容的提问来源于stack exchange,提问作者Alpha Bot
相关产品推荐
相关产品推荐

