Flutter Navigator报错'_history.isNotEmpty'问题修复咨询
修复Flutter导航栈断言错误 (
_history.isNotEmpty) 问题原因
你遇到的'package:flutter/src/widgets/navigator.dart': Failed assertion: line 5501 pos 12: '_history.isNotEmpty': is not true错误,核心原因是logUserOut方法中连续执行了两次Navigator.pop(context):
- 第一次
pop关闭抽屉是合理操作 - 第二次
pop会尝试退出当前页面,但如果当前页面已经是导航栈的最后一页,执行后会直接清空导航栈,后续的Navigator.push就会触发栈为空的断言错误,最终导致空白页面。
另外,登出场景下不应保留登录后的页面栈(用户不该能返回登录状态的页面),直接用push也不符合业务逻辑。
修复方案
修改logUserOut方法,移除多余的pop操作,改用Navigator.pushAndRemoveUntil清空导航栈并跳转至登出页面:
void logUserOut(BuildContext context) { // 仅关闭抽屉 Navigator.pop(context); // 跳转至登出页面,同时清空所有历史路由 Navigator.pushAndRemoveUntil( context, MaterialPageRoute(builder: (context) => const HandleLogout()), (Route<dynamic> route) => false, // 条件为false表示移除全部历史页面 ); }
补充说明
pushAndRemoveUntil会将新页面加入栈中,同时移除所有满足条件的历史页面,这里的条件确保登出后导航栈仅保留HandleLogout页面,避免用户返回登录状态的页面。- 如果你的
HandleLogout组件在完成Firebase登出后会自动跳转至登录页,也可以在HandleLogout内部使用pushAndRemoveUntil完成登录页跳转,保持逻辑统一。
内容的提问来源于stack exchange,提问作者Mustafa Ismailjee
相关产品推荐
相关产品推荐

