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

如何使用Flutter的bottom_navy_bar包实现底部导航栏页面切换

解决方案

你只需要补充待切换的页面列表,再将Scaffold的body和标题绑定_currentIndex变量即可,具体修改如下:

步骤1:定义页面与标题列表

在_HaberScreenState类中新增两个列表,分别对应底部导航的5个页面和对应标题:

// 存放所有待切换的页面
late List<Widget> _pages;
// 存放对应页面的AppBar标题
final List<String> _pageTitles = const ['Haberler', 'Sektörler', 'Kurlar', 'Raporlar', 'Ayarlar'];

然后在initState方法中初始化页面列表,第一个页面保留你原本的WebView逻辑,剩下的页面可以替换为你自己的业务Widget:

@override
void initState() {
  super.initState();
  if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
  // 初始化页面列表
  _pages = [
    // 第一个页面:原有的Haberler WebView
    Builder(builder: (BuildContext context) {
      return WebView(
        initialUrl: 'https://www.google.com',
        javascriptMode: JavascriptMode.unrestricted,
        onWebViewCreated: (WebViewController webViewController) {
          _controller.complete(webViewController);
        },
        onProgress: (int progress) {
          print("WebView is loading (progress : $progress%)");
        },
        javascriptChannels: <JavascriptChannel>{
          _toasterJavascriptChannel(context),
        },
        navigationDelegate: (NavigationRequest request) {
          if (request.url.startsWith('https://www.youtube.com/')) {
            print('blocking navigation to $request}');
            return NavigationDecision.prevent;
          }
          print('allowing navigation to $request');
          return NavigationDecision.navigate;
        },
        onPageStarted: (String url) {
          print('Page started loading: $url');
        },
        onPageFinished: (String url) {
          print('Page finished loading: $url');
        },
        gestureNavigationEnabled: true,
      );
    }),
    // 第二个页面:Sektörler 示例占位,可替换为你的实际页面
    const Center(child: Text('Sektörler Sayfası')),
    // 第三个页面:Kurlar 示例占位
    const Center(child: Text('Kurlar Sayfası')),
    // 第四个页面:Raporlar 示例占位
    const Center(child: Text('Raporlar Sayfası')),
    // 第五个页面:Ayarlar 示例占位
    const Center(child: Text('Ayarlar Sayfası')),
  ];
}

步骤2:绑定body和标题到_currentIndex

修改Scaffold的两个属性:

  1. 将原本固定的body替换为IndexedStack,可以保留页面切换状态,避免WebView等组件重复加载:
body: IndexedStack(
  index: _currentIndex,
  children: _pages,
),

如果不需要保留页面状态,也可以直接写成body: _pages[_currentIndex],内存占用更低。

  1. 修改AppBar的title,跟随选中的导航项变化:
title: Row(
  mainAxisAlignment: MainAxisAlignment.center,
  children: [
    Text(
      _pageTitles[_currentIndex], // 替换原本固定的'Haberler'
      style: TextStyle(color: Colors.red, fontSize: 25.0),
    )
  ],
),

提示:如果多个页面都是WebView,你可以封装一个通用的WebViewWidget,传入不同的url参数即可,避免重复编写WebView配置代码。

修改完成后点击底部导航栏,就会自动切换对应页面,你原本的底部导航onItemSelected逻辑已经正确更新了_currentIndex,不需要额外调整。


内容的提问来源于stack exchange,提问作者Mıktad Tahir Durak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:48:03