使用persistent_bottom_nav_bar返回首页后点击Tab报错:Looking up a deactivated widget's ancestor is unsafe
问题原因分析
你通过pushAndRemoveUntil重新创建了HomePage实例并替换了整个页面栈,但persistent_bottom_nav_bar内部仍持有原来的HomePage实例引用。当点击底部Tab时,框架尝试访问已被销毁的旧HomePage上下文,因此触发了"Looking up a deactivated widget's ancestor is unsafe"异常。
解决方案
方案1:使用插件自带控制器切换Tab(推荐)
- 主页面初始化底部导航控制器:
final PersistentTabController _tabController = PersistentTabController(initialIndex: 0);
- 将控制器传入
PersistentBottomNavBar配置:
PersistentBottomNavBar( controller: _tabController, screens: _buildTabScreens(), // 你的Tab页面列表 items: _navBarItems(), // 其他配置项... )
- 从其他页面返回首页时,直接调用控制器切换Tab并清空栈:
// 回到底部导航的页面栈(针对全屏无导航的页面) PersistentNavBarNavigator.popUntilFirst(context); // 切换到第一个Tab _tabController.jumpToTab(0);
方案2:修改返回逻辑,避免重建HomePage
不要重新创建HomePage实例,而是用popUntil回到原有实例:
// 假设HomePage的路由名称设置为"Home" Navigator.of(context).popUntil((route) => route.settings.name == "Home");
如果未设置路由名称,可通过页面类型判断:
Navigator.of(context).popUntil((route) => route.builder(context) is HomePage);
方案3:使用插件提供的方法打开页面
从首页打开其他页面时,用插件的pushNewScreen代替原生Navigator.push:
PersistentNavBarNavigator.pushNewScreen( context, screen: OtherPage(), withNavBar: false, // 打开页面时隐藏底部导航 pageTransitionAnimation: PageTransitionAnimation.cupertino, );
在OtherPage中返回首页直接调用:
Navigator.pop(context);
这种方式会保留原HomePage实例,不会破坏插件的内部状态。
内容的提问来源于stack exchange,提问作者Abdullah
相关产品推荐
相关产品推荐

