You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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(推荐)

  1. 主页面初始化底部导航控制器:
final PersistentTabController _tabController = PersistentTabController(initialIndex: 0);
  1. 将控制器传入PersistentBottomNavBar配置:
PersistentBottomNavBar(
  controller: _tabController,
  screens: _buildTabScreens(), // 你的Tab页面列表
  items: _navBarItems(),
  // 其他配置项...
)
  1. 从其他页面返回首页时,直接调用控制器切换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 13:35:46