Flutter递归调用Navigator.push报错:访问已停用Widget祖先不安全
错误原因分析
Context失效是核心问题
你递归调用_chamaformulario时,用的是ListView列表项的BuildContext。ListView.builder是按需渲染的,当列表项滚出可视区域、或者因为前一个表单跳转导致页面状态变化,对应的列表项Widget会被Flutter标记为deactivated(失活)甚至被销毁。这时候再用这个已经失活的Context去调用Navigator.push,Flutter就会报错——因为这个Context对应的Element已经不在稳定的Element树里了,去查找Navigator这类祖先Widget是不安全的。递归逻辑的Context复用问题
首次调用时,当前点击的列表项还在可视区域,Context处于活跃状态,所以能正常跳转。但递归到下一个索引时,你大概率复用了之前列表项的Context,或者下一个列表项还没被构建(没进入可视区域),它的Context根本没生成,强行使用就会触发错误。错误的Context层级选择
如果你是在列表项的Widget内部定义的_chamaformulario,用的是列表项的局部Context。而Navigator是在页面的根层级(比如Scaffold上层),当列表项被销毁后,这个局部Context无法再正确定位到Navigator的祖先节点,自然会报错。
内容的提问来源于stack exchange,提问作者Mateus
相关产品推荐
相关产品推荐

