如何根据已设置的主题更改 flutter 中的状态栏图标和文本颜色?

How to change status bar icon and text color in flutter based on theme been set?

如何在没有任何第三方插件的情况下更新状态栏图标的颜色?

在我的主题中 class 我有一个函数,我正在尝试下面的代码但尚未取得结果:

目前的主题代码:


// custom light theme for app
  static final customLightTheme = ThemeData.light().copyWith(
    brightness: Brightness.light,
    primaryColor: notWhite,
    accentColor: Colors.amberAccent,
    scaffoldBackgroundColor: notWhite,
    primaryTextTheme: TextTheme(
      title: TextStyle(
        color: Colors.black
      ),

    ),
    appBarTheme: AppBarTheme(
      iconTheme: IconThemeData(color: Colors.black),
      elevation: 0.0,
    )
  );

  // custom dark theme for app
  static final customDarkTheme = ThemeData.dark().copyWith(
    brightness: Brightness.dark,
    primaryColor: Colors.black,
      accentColor: Colors.orange,
      scaffoldBackgroundColor: Colors.black87,
      primaryTextTheme: TextTheme(
        title: TextStyle(
            color: Colors.white
        ),

      ),
      appBarTheme: AppBarTheme(
        iconTheme: IconThemeData(color: Colors.white),
        elevation: 0.0,
      ),

  );


主题转换器代码:


// set theme for the app
   setTheme(ThemeData theme) {
     _themeData = theme;

     if(_themeData == ThemeChanger.customLightTheme){
       SystemChrome.setSystemUIOverlayStyle(
         const SystemUiOverlayStyle(
           statusBarColor: Colors.white,
           systemNavigationBarColor: Colors.white,
           systemNavigationBarDividerColor: Colors.black,
           systemNavigationBarIconBrightness: Brightness.dark,
         ),
       );
     } else {
       SystemChrome.setSystemUIOverlayStyle(
         const SystemUiOverlayStyle(
           statusBarColor: Colors.blue,
           systemNavigationBarColor: Colors.blue,
           systemNavigationBarDividerColor: Colors.red,
           systemNavigationBarIconBrightness: Brightness.light,
         ),
       );
     }

     notifyListeners();
   }


这不是我想要的,因为我不想要第三方解决方案。

Icon's color in status bar (Flutter)

目前我在白色/浅色主题中得到黑色图标,在主题更改时在深色/黑色主题中也得到黑色图标(应该是白色图标)。休息一切正常。

您可以通过调用 setSystemUIOverlayStyle 所需的主题来设置状态栏主题。

SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark);

SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light);

更新:

您可以指定自己的属性,例如,

SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
  statusBarColor: Colors.white
));

检查可用属性 here


注意:对于应用的 light 主题,使用 dark 覆盖,反之亦然。还要确保 import 'package:flutter/services.dart';

希望对您有所帮助!

这个改变主题的答案对我不起作用,但我使用了这个。我知道两者是相同的东西,但通过这种方式,我们也可以使用颜色和图标主题。

 SystemChrome.setSystemUIOverlayStyle(
            SystemUiOverlayStyle(
                statusBarColor: Color(0xFFdde6e8),
                statusBarIconBrightness: Brightness.dark),
          );

注:
如果集合 SystemUiOverlayStyle 没有被 AppBar.

等其他小部件覆盖,则接受的答案有效

更新

因为很多人有这个问题,所以添加一个我能想到的所有情况的答案。

对于所有情况,请酌情使用 systemOverlayStyle

浅色主题

SystemUiOverlayStyle.light

深色主题

SystemUiOverlayStyle.dark

自定义

SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
  systemNavigationBarColor: Color(0xFF000000),
  systemNavigationBarIconBrightness: Brightness.light,
  systemNavigationBarDividerColor: null,
  statusBarColor: Color(0xFFD59898),
  statusBarIconBrightness: Brightness.light,
  statusBarBrightness: Brightness.dark,
));

仅覆盖必需的属性。前 3 个用于导航栏,其余 3 个用于状态栏。

1。默认大小写

整个应用程序的恒定系统覆盖样式,没有应用栏和其他干扰系统 UI 覆盖样式的小部件。

build 方法内将此代码添加到应用 的 根小部件。

SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light);

2。具有固定系统覆盖样式的应用

整个应用程序的固定主题,带有应用栏。

如果屏幕没有应用栏,请添加选项 1 中给出的代码,然后再添加此代码。

MaterialApp(
    theme: ThemeData(
        appBarTheme: const AppBarTheme(
            systemOverlayStyle: SystemUiOverlayStyle.light,
        ),
    ),
),

3。具有不同系统叠加样式的应用栏的应用

每个应用栏都有不同的系统覆盖样式。

appBar: AppBar(
    title: const Text('Title text'),
    systemOverlayStyle: SystemUiOverlayStyle.light,
)

以下版本的旧答案 2.4.0-0.0

brightness 属性在 AppBar 中已弃用。

This feature was deprecated after v2.4.0-0.0.pre

appBar: AppBar(
    title: const Text('Title text'),
    brightness: Brightness.dark,
),

根据需要使用Brightness.lightBrightness.dark

如果您使用的是 AppBar,则有 brightness 属性。您可以将亮度 属性 设置为 dark,这样状态栏的图标就会变白。

AppBar(
    brightness: Brightness.dark
)

更改状态栏图标颜色(白色)。

将此 SystemChrome... 添加到您的 void main()。在此之前不要忘记 import 'package:flutter/services.dart';.

void main() {
  SystemChrome.setSystemUIOverlayStyle(
    SystemUiOverlayStyle(
      statusBarIconBrightness: Brightness.light,
    ),
  );
  runApp(MyApp());
}

在此之后,如果您将 Scaffold() 用于 screen/page,则在 AppBar() 中添加此行 brightness: Brightness.dark,像这样,

return Scaffold(
      appBar: AppBar(
        brightness: Brightness.dark,

然后完成。

如果您在整个应用中使用主题生成器,可以使用如下新方法将亮度(图标颜色)更改为白色或黑色

class MyApp extends StatelessWidget {

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'My App',
      debugShowCheckedModeBanner: false,
      builder: (context, navigator) {
        return Theme(
          data: ThemeData(
              primaryColor: AppColors.primary,
              accentColor: AppColors.accent,
              appBarTheme: AppBarTheme(systemOverlayStyle: 
       SystemUiOverlayStyle.light) ,//this is new way to change icons color of status bar
              fontFamily: 'Poppins'
          ),
          child: navigator,
        );
      },
      
    );
  }
}

更新 (Flutter 2.4.0)

不要使用 AnnotatedRegionAppBar.brightness,因为它们已被弃用,请改用:

  • 较少自定义:

    AppBar(
      systemOverlayStyle: SystemUiOverlayStyle.dark, // Both iOS and Android (dark icons)
    )
    
  • 更多定制:

    AppBar(
      systemOverlayStyle: SystemUiOverlayStyle(
        statusBarBrightness: Brightness.light, // For iOS: (dark icons)
        statusBarIconBrightness: Brightness.dark, // For Android: (dark icons)
        statusBarColor: ...,
      ),
    )
    

我还没有找到专门设置状态栏图标颜色的方法,但对我来说它可以将 属性 systemStatusBarContrastEnforced 设置为 true

SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
  systemStatusBarContrastEnforced: true,
  ));