使用AutoTabsRouter断网时切换至Downloads标签并禁用其他标签的问题
问题分析与解决方案
你遇到的核心问题是:断网时仅修改了底部导航的显示索引,但未主动触发AutoTabsRouter切换标签页内容,导致索引显示和实际页面内容不同步。
问题根源
你的代码中,state.isMessageVisible(断网状态)时仅将bottomNavigationBar的currentIndex设为3,但没有让AutoTabsRouter的activeIndex同步更新,标签页内容自然不会切换。
修复方案
在BlocBuilder的构建逻辑中,监听断网状态,主动触发AutoTabsRouter切换到Downloads标签页(索引3),同时避免重复触发:
return AutoTabsRouter( duration: const Duration(microseconds: 0), navigatorObservers: () => [HeroController()], routes: const [ NewsRouter(), VideosRouter(), EventsRouter(), DownloadsRouter(), ], builder: (context, child, animation) { final tabsRouter = AutoTabsRouter.of(context); return BlocBuilder<ConnectivityBloc, ConnectivityState>( builder: (context, state) { // 断网时强制切换到Downloads标签页,避免重复调用 if (state.isMessageVisible && tabsRouter.activeIndex != 3) { // 使用postFrameCallback确保当前帧构建完成后执行,避免BuildContext异常 WidgetsBinding.instance.addPostFrameCallback((_) { tabsRouter.setActiveIndex(3); }); } return Scaffold( extendBody: true, appBar: state.isMessageVisible ? const PreferredSize( preferredSize: Size.fromHeight(kLargeSize), child: ConnectivityAppBar(), ) : null, body: FadeTransition( opacity: animation, child: child, ), bottomNavigationBar: MyBottomNavigationBar( currentIndex: state.isMessageVisible ? 3 : tabsRouter.activeIndex, onTap: state.isMessageVisible ? (index) { if (index == 3) { tabsRouter.setActiveIndex(index); } } : tabsRouter.setActiveIndex, items: [...] ), ); }, ); }, );
关键说明
- 主动触发索引切换:通过判断断网状态和当前活跃索引,主动调用
tabsRouter.setActiveIndex(3),让AutoTabsRouter同步切换内容。 - 避免重复触发:添加
tabsRouter.activeIndex != 3的判断,防止状态多次更新时重复执行切换操作。 - 使用postFrameCallback:确保在当前Widget树构建完成后再执行索引切换,避免BuildContext相关的异常。
内容的提问来源于stack exchange,提问作者Stark
相关产品推荐
相关产品推荐

