Android 15 & 16 三键导航栏图标颜色修改问题
Android 15 & 16 三键导航栏图标颜色修改问题
嘿,我刚好折腾过类似的问题,给你分享几个针对 Flutter + Android 15/16(API35/36)场景的可行方案,亲测有效:
方案一:修改 Android 原生主题配置(最稳定)
这个是我最先搞定的方法,直接从Android原生主题入手,基本不会和Flutter的主题冲突:
- 打开项目里的
android/app/src/main/res/values/styles.xml,找到你的App主题(一般叫LaunchTheme或者NormalTheme),添加这两个关键属性:
这里的<item name="android:navigationBarIconColor">@color/your_custom_icon_color</item> <item name="android:navigationBarContrastEnforced">false</item>your_custom_icon_color是你提前在res/values/colors.xml里定义的颜色,比如:<color name="nav_icon_black">#FF000000</color> - 如果你的App支持深色模式,记得同步修改
res/values-night/styles.xml里的对应属性,保证深色主题下图标颜色也符合你的需求。 - 划重点:
navigationBarContrastEnforced这个属性一定要加!Android 15开始系统会强制检查导航栏图标和背景的对比度,不加的话系统可能直接覆盖你的自定义颜色,用回默认的深灰/浅灰。
方案二:Flutter 代码动态控制(适合主题切换场景)
如果你需要根据App内的主题动态切换导航栏图标颜色,可以用Flutter的SystemChrome来设置:
- 先导入
services.dart包,然后写一个控制方法:import 'package:flutter/services.dart'; void updateNavigationBarIcons() { SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( // 控制图标亮度:Brightness.dark是深色图标,Brightness.light是浅色图标 systemNavigationBarIconBrightness: Brightness.dark, // 必须设置导航栏背景色,确保和图标颜色的对比度符合要求 systemNavigationBarColor: Colors.white, // 同样要关闭系统强制对比度检查 systemNavigationBarContrastEnforced: false, )); } - 你可以在App启动的时候调用这个方法,或者在切换主题的逻辑里触发,就能动态更新图标颜色了。
几个要注意的小细节
- 一定要用API35/36的模拟器或者真实的Android15/16设备测试,低版本设备不支持这些新属性。
- 检查一下Flutter的
MaterialApp主题里有没有设置navigationBarTheme,如果有的话,要确保和你原生主题的设置不冲突。 - 如果还是不生效,重启一下模拟器或者清理一下Android项目的构建缓存(在
android目录下执行./gradlew clean),有时候缓存会导致设置不生效。
我当时就是用第一种方案搞定的,你可以先试试这个,有问题随时交流哈!




