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

Flutter BottomNavigationBar添加switch后选中项颜色不生效问题

问题原因

你在BottomNavigationBar的onTap回调里只实现了加载不同URL的逻辑,但没有更新_selectedIndex的状态。BottomNavigationBar的选中状态依赖currentIndex,而currentIndex绑定的是_selectedIndex,只有通过setState更新这个变量,Flutter才会重新渲染导航栏,切换选中项的颜色。

修复方案

有两种简单的修复方式,选一种即可:

方式一:在onTap回调里直接更新_selectedIndex

修改BottomNavigationBar的onTap部分,在URL加载逻辑前后加入setState更新选中索引:

onTap: (index) {
  setState(() {
    _selectedIndex = index;
  });
  switch (index) {
    case 0:
      webViewController?.loadUrl(
          urlRequest: URLRequest(url: url));
      break;
    case 1:
      webViewController?.loadUrl(
          urlRequest: URLRequest(url: url2));
      break;
    case 2:  
      webViewController?.loadUrl(
          urlRequest: URLRequest(url: url3));
      break;
  }
},

方式二:复用已有的_onItemTapped方法并扩展逻辑

既然你已经定义了_onItemTapped方法,可以在这个方法里同时处理索引更新和URL加载,然后在onTap里直接调用它:

// 修改_onItemTapped方法
void _onItemTapped(int index) {
  setState(() {
    _selectedIndex = index;
  });
  // 加入URL加载逻辑
  switch (index) {
    case 0:
      webViewController?.loadUrl(
          urlRequest: URLRequest(url: url));
      break;
    case 1:
      webViewController?.loadUrl(
          urlRequest: URLRequest(url: url2));
      break;
    case 2:  
      webViewController?.loadUrl(
          urlRequest: URLRequest(url: url3));
      break;
  }
}

// 然后BottomNavigationBar的onTap直接绑定这个方法
onTap: _onItemTapped,
完整修改后的代码示例(以方式二为例)
import 'dart:io';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';

class MyInAppBrowser extends InAppBrowser {
  @override
  Future onBrowserCreated() async {
    print("Browser Created!");
  }

  @override
  Future onLoadStart(url) async {
    print("Started $url");
  }

  @override
  Future onLoadStop(url) async {
    print("Stopped $url");
  }

  @override
  void onLoadError(url, code, message) {
    print("Can't load $url.. Error: $message");
  }

  @override
  void onProgressChanged(progress) {
    print("Progress: $progress");
  }

  @override
  void onExit() {
    print("Browser closed!");
  }
}

class MyAppbrowser extends StatefulWidget {
  final MyInAppBrowser browser = new MyInAppBrowser();

  @override
  _MyAppState createState() => new _MyAppState();
}

class _MyAppState extends State<MyAppbrowser> {
  InAppWebViewController? webViewController;
  var url = Uri.parse("https://gmail.com");
  var url2 = Uri.parse("https://bing.com");
  var url3 = Uri.parse("https://Facebook.com");
  int _selectedIndex = 0;
  bool isLoading = true;
  var options = InAppBrowserClassOptions(
      crossPlatform: InAppBrowserOptions(hideUrlBar: false),
      inAppWebViewGroupOptions: InAppWebViewGroupOptions(
        ios: IOSInAppWebViewOptions(),
          crossPlatform: InAppWebViewOptions(javaScriptEnabled: true)));

  void _onItemTapped(int index) {
    setState(() {
      _selectedIndex = index;
    });
    // 添加URL加载逻辑
    switch (index) {
      case 0:
        webViewController?.loadUrl(
            urlRequest: URLRequest(url: url));
        break;
      case 1:
        webViewController?.loadUrl(
            urlRequest: URLRequest(url: url2));
        break;
      case 2:  
        webViewController?.loadUrl(
            urlRequest: URLRequest(url: url3));
        break;
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(toolbarHeight: 10),
      body: Stack(
          children:[
          InAppWebView(
            initialUrlRequest:URLRequest(
                url: Uri.parse("https://google.com"),
            ),
            onWebViewCreated: (controller) {
              webViewController = controller;
            },
          )
        ]
      ),
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: _selectedIndex,
        backgroundColor: Colors.white,
        items: const <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            icon: Icon(Icons.call),
            label: "home",
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.camera),
            label: "camera",
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.chat),
            label: "chat",
          ),
        ],
        type: BottomNavigationBarType.fixed,
        unselectedItemColor: Colors.grey,
        selectedItemColor: Colors.black,
        // 直接绑定_onItemTapped方法
        onTap: _onItemTapped,
      ),
    );
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:25:26