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

使用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: [...]
          ),
        );
      },
    );
  },
);

关键说明

  1. 主动触发索引切换:通过判断断网状态和当前活跃索引,主动调用tabsRouter.setActiveIndex(3),让AutoTabsRouter同步切换内容。
  2. 避免重复触发:添加tabsRouter.activeIndex != 3的判断,防止状态多次更新时重复执行切换操作。
  3. 使用postFrameCallback:确保在当前Widget树构建完成后再执行索引切换,避免BuildContext相关的异常。

内容的提问来源于stack exchange,提问作者Stark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:28:28