Flutter异步导航后二次Navigator.pushNamed触发构建错误排查
问题原因分析
核心原因是第二次导航的时机与当前页面的构建流程冲突:
从payment_checkout_mobile页面pop返回时,当前页面可能正处于GetBuilder<ProductController>的重建过程中(比如页面因状态更新触发了build)。此时直接调用Navigator.pushNamed会触发新的页面跳转,而页面跳转本质上会触发上下文的状态变化(类似setState/markNeedsBuild),这违反了Flutter的规则:不能在组件构建过程中调用修改组件状态的方法。
你代码里的!mounted判断仅能保证当前组件未被销毁,无法判断组件是否正处于build流程中,因此无法规避这个冲突。
解决方案
将第二次导航延迟到当前build周期结束后执行,使用WidgetsBinding.instance.addPostFrameCallback包裹导航逻辑:
onPressed: () async { String checkoutSessionUrl = await saveForm(); if (!mounted) return; await Navigator.pushNamed( context, '/payment_checkout_mobile', arguments: PaymentCheckoutArguments(checkoutSessionUrl), ); if (!mounted) return; // 延迟到当前构建周期结束后执行导航 WidgetsBinding.instance.addPostFrameCallback((_) { Navigator.pushNamed(context, '/payment_success_page'); }); },
这个方法会在当前帧的所有组件构建完成后再执行回调里的导航操作,彻底避免了状态更新与构建流程的冲突。
内容的提问来源于stack exchange,提问作者iKK
相关产品推荐
相关产品推荐

