如何在Flutter中更改状态栏颜色?


Answers:


121

在我的应用程序中完全正常

import 'package:flutter_statusbarcolor/flutter_statusbarcolor.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    FlutterStatusbarcolor.setStatusBarColor(Colors.white);
    return MaterialApp(
      title: app_title,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomePage(title: home_title),
    );
  }
}

这个包

UPD: 另一种解决方案

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

8
非常感谢Andrey;它起作用了……唯一的问题是背景是白色的,但是时钟,无线和其他文本和图标也都是白色的..我不确定为什么!(我希望文本和图标为黑色)
Mohamed Hassan

1
我也没有找到。我已经编辑过帖子-还有另一个更简单的设置状态栏颜色的解决方案
Andrey Turkovsky

1
优秀。只是一点评论...您必须打开pubspec.yaml文件,并在依赖项行下添加下一行:flutter_statusbarcolor:^ 0.2.3(在此处检查最新版本[ pub.dev/packages/flutter_statusbarcolor#-installing-tab -]
hfunes.com

1
@JayTillu没有 对于iOS,您必须手动使用flutter_statusbarcolor或设置每种颜色AppBar
Andrey Turkovsky

1
它会更改状态栏的背景,而不是状态栏本身的文本。
Abdulrahman Masoud

97

更新(推荐):

在最新的Flutter版本上,您应该使用:

AppBar(
  backwardsCompatibility: false,
  systemOverlayStyle: SystemUiOverlayStyle(statusBarColor: Colors.orange),
)

仅Android(更具灵活性):

import 'package:flutter/services.dart';

void main() {
  SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
    systemNavigationBarColor: Colors.blue, // navigation bar color
    statusBarColor: Colors.pink, // status bar color
  ));
}

iOS和Android:

appBar: AppBar(
  backgroundColor: Colors.red, // status bar color
  brightness: Brightness.light, // status bar brightness
)

我是flutter的新手,我想知道如果将这些行放在任何小部件的build方法中怎么办?有什么区别吗?
巴夫尼克'19

它将起作用,并且没有任何区别。请记住,颜色将设置为最新呼叫者的参数。
姚彬然后

将应用程序主题从浅色更改为深色,反之亦然时,如何更改状态栏文本的颜色?ThemeData类中是否有任何属性?
Vinoth Vino

@VinothVino对不起,但您不能为状态栏项提供所选的文本颜色,您所能做的就是change brightness,其中Brightness.light显示黑色文本颜色并Brightness.dark显示白色。
CopsOnRoad

感谢您的答复兄弟。如何动态更改亮度?我正在更改黑暗模式,它没有正确更新。如果我热重启该应用程序,那么它将起作用。
Vinoth Vino

46

代替通常建议的SystemChrome.setSystemUIOverlayStyle()是系统范围的服务并且不会在其他路由上重置的方法,可以使用,AnnotatedRegion<SystemUiOverlayStyle>它是一个小部件,仅对包装的小部件有效。

AnnotatedRegion<SystemUiOverlayStyle>(
   value: SystemUiOverlayStyle(
      statusBarColor: Colors.white,
  ),
  child: Scaffold(
      ...
  ),
)

1
这是最好的答案,因为在按下按钮后弹出窗口将重置状态栏。这是Jordy在这里首先提到的stackoverflow.com/a/54593164/4033525
Sameer J,

1
我也相信,如果我们在整个应用程序中都需要它,那将是最好的答案
Abbas

1
我在一个屏幕上使用它,并且在应用程序的所有其他屏幕上都起作用。我在第一个屏幕上使用它,然后自然连接了其他屏幕,因此在所有其他屏幕上,它具有相同的状态栏颜色(白色)。如何预防这种行为?如何使其仅在特定支架上起作用?
gegobyte '20

@gegobyte我有同样的问题。我所做的是使用1种全局颜色,该颜色在大多数视图中都使用。但是在特定的视图中,需要使用不同的颜色,我只是重用了相同的小部件,但是使用了不同的颜色
Andris

45

对于那些使用 AppBar

如果使用,AppBar则更新状态栏颜色非常简单:

Scaffold(
  appBar: AppBar(
    // Use [Brightness.light] for black status bar 
    // or [Brightness.dark] for white status bar
    brightness: Brightness.light 
  ),
  body: ...
)

申请所有应用栏:

return MaterialApp(
  theme: Theme.of(context).copyWith(
    appBarTheme: Theme.of(context)
        .appBarTheme
        .copyWith(brightness: Brightness.light),
  ...
  ),

对于那些不使用的人 AppBar

用来包装您的内容,AnnotatedRegion并将其设置valueSystemUiOverlayStyle.lightSystemUiOverlayStyle.dark

return AnnotatedRegion<SystemUiOverlayStyle>(
  // Use [SystemUiOverlayStyle.light] for white status bar 
  // or [SystemUiOverlayStyle.dark] for black status bar
  value: SystemUiOverlayStyle.light,
  child: Scaffold(...),
);

2
此方法不允许设置确切的颜色
kashlo

如果您想根据自己的主题获取状态栏的颜色,可以随时使用brightness: Theme.of(context).brightness
Roman Panaget

1
value: SystemUiOverlayStyle.light(或.dark)做同样的事情
damd'd

12

不使用时更改状态栏颜色 AppBar

首先导入

import 'package:flutter/services.dart';

现在,当您不使用以下代码时,使用以下代码更改应用程序中状态栏的颜色 AppBar

SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark.copyWith(

    statusBarColor: AppColors.statusBarColor,/* set Status bar color in Android devices. */
    
    statusBarIconBrightness: Brightness.dark,/* set Status bar icons color in Android devices.*/
    
    statusBarBrightness: Brightness.dark)/* set Status bar icon color in iOS. */
); 

要更改状态栏的颜色iOS,当您使用SafeArea

Scaffold(
  body: Container(
    color: Colors.red, /* Set your status bar color here */
    child: SafeArea(child: Container(
      /* Add your Widget here */
    )),
  ),
); 

我将SafeArea放在支架之前被发现,这阻止了支架的背景色在状态栏后面延伸。
Bulwinkel

8

由于尚不具备必要的声誉,因此我无法在线程中直接发表评论,但是作者提出了以下要求:

唯一的问题是背景是白色,但是时钟,无线和其他文本和图标也都是白色..我不确定为什么!

对于使用此线程的其他人,这对我有用。状态栏的文本颜色由中的亮度常数决定flutter/material.dart。要更改此设置,请SystemChrome像这样调整解决方案以配置文本:

    SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
      statusBarColor: Colors.red,
      statusBarBrightness: Brightness.dark,
    ));

您可能值BrightnessBrightness.darkBrightness.light

文档:https : //api.flutter.dev/flutter/dart-ui/Brightness-class.html https://api.flutter.dev/flutter/services/SystemUiOverlayStyle-class.html


8

这为我工作:

进口服务

import 'package:flutter/services.dart';

然后加:

@override
  Widget build(BuildContext context) {

    SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
      statusBarColor: Colors.white,
      statusBarBrightness: Brightness.dark,
    ));
    return MaterialApp(home: Scaffold(

6

我认为这将帮助您:

SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
        systemNavigationBarColor: Colors.white, // navigation bar color
        statusBarColor: Colors.white, // status bar color
        statusBarIconBrightness: Brightness.dark, // status bar icons' color
        systemNavigationBarIconBrightness: Brightness.dark, //navigation bar icons' color
    ));

5

这是您需要了解的所有内容:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
    systemNavigationBarColor: Colors.amber, // navigation bar color
    statusBarColor: Colors.white, // status bar color
    statusBarIconBrightness: Brightness.dark, // status bar icon color
    systemNavigationBarIconBrightness: Brightness.dark, // color of navigation controls
  ));
  runApp(MyApp());
}

4

它可以通过两个步骤实现:

  1. 使用FlutterStatusbarcolor软件包将状态栏颜色设置为与页面背景匹配
  2. 使用AppBar.brightness属性设置状态栏按钮的颜色(电池,WiFi等)

如果您有AppBar

  @override
  Widget build(BuildContext context) {
    FlutterStatusbarcolor.setStatusBarColor(Colors.white);
    return Scaffold(
      appBar: AppBar(
        brightness: Brightness.light,
        // Other AppBar properties
      ),
      body: Container()
    );
  }

如果您不想在页面中显示应用栏:

  @override
  Widget build(BuildContext context) {
    FlutterStatusbarcolor.setStatusBarColor(Colors.white);
    return Scaffold(
      appBar: AppBar(
        brightness: Brightness.light,
        elevation: 0.0,
        toolbarHeight: 0.0, // Hide the AppBar
      ),
      body: Container()
  }

这也在iOS中针对SafeArea进行了测试?
LOG_TAG '20

3

在main.dart文件导入服务上,如下所示

  import 'package:flutter/services.dart';

在内部构建方法中,只需在返回之前添加此行

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

像这样:

@override
 Widget build(BuildContext context) {
   SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
       statusBarColor: CustomColors.appbarcolor
    ));
    return MaterialApp(
    home: MySplash(),
    theme: ThemeData(
      brightness: Brightness.light,
      primaryColor: CustomColors.appbarcolor,
    ),
  );
 }



2

到目前为止,这是最好的方法,它不需要额外的插件。

Widget emptyAppBar(){
  return PreferredSize(
      preferredSize: Size.fromHeight(0.0), 
      child: AppBar(
        backgroundColor: Color(0xFFf7f7f7),
        brightness: Brightness.light,
      )
  );
}

像这样在你的脚手架上叫它

return Scaffold(
      appBar: emptyAppBar(),
     .
     .
     .

1

使它像您的应用栏颜色

import 'package:flutter/material.dart';

 Widget build(BuildContext context) {
  SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
      statusBarColor: Colors.transparent,
      systemNavigationBarColor: Colors.transparent,
  ));
 }

1

适用于iOS和Android

import 'package:flutter/services.dart';

@override
Widget build(BuildContext context) {
  SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark);

  return Scaffold();
}
    

0
@override
Widget build(BuildContext context) {
  return Theme(
    data: ThemeData(brightness: Brightness.dark),
    child: Scaffold()
    ....
  )
}

3
请不要仅发布代码作为答案,还请提供解释代码的作用以及如何解决问题的方法。带有解释的答案通常质量更高,并且更有可能吸引投票。
Mark Rotteveel

0

我遇到了所有提到的答案的问题,但我自己做了解决方案:Container(width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).padding.top, color: Colors.green) 对于视图,没有添加appBar的地方,我只是使用背景高度与状态栏高度完全匹配的容器。在这种情况下,每个视图可以具有不同的状态颜色,而我不必担心和思考一些逻辑,即某种程度上错误的视图具有某种错误的颜色。


0

现有的解决方案都没有帮助我,因为我不使用,AppBar并且不想在用户切换应用程序主题时发表声明。我需要一种反应性的方式来在亮和暗模式之间切换,并且发现它AppBar使用一个称为Semantics状态栏颜色设置的小部件。

基本上,这就是我的方法:

return Semantics(
  container: false,  // don't make it a new node in the hierarchy
  child: AnnotatedRegion<SystemUiOverlayStyle>(
    value: SystemUiOverlayStyle.light,  // or .dark
    child: MyApp(),  // your widget goes here
  ),
);
  • Semantics是从导入的package:flutter/material.dart
  • SystemUiOverlayStyle是从导入的package:flutter/services.dart

面临与上述相同的问题,但解决方案在Andorid 10中无效
Aditi

0

我通过更改整个背景颜色来解决它,如下所示:

在主屏幕中:

返回脚手架(

  backgroundColor: Colors.black,

  body: SafeArea(
  
 ),

);


0

大多数答案都在使用SystemChrome,仅适用于Android。我的解决方案是结合了AnnotatedRegion,并SafeArea为新的构件,因此它也可以在iOS中。我可以使用它,也可以不使用它AppBar

class ColoredStatusBar extends StatelessWidget {
  const ColoredStatusBar({Key key, this.color, this.child}) : super(key: key);

  final Color color;
  final Widget child;

  @override
  Widget build(BuildContext context) {
    return AnnotatedRegion<SystemUiOverlayStyle>(
      value: SystemUiOverlayStyle(
        statusBarColor: color ?? Colors.blue,
      ),
      child: Container(
        color: color ?? Colors.blue,
        child: SafeArea(
          bottom: false,
          child: Container(
            child: child,
          ),
        ),
      ),
    );
  }
}

用法:将其放置在页面小部件的顶部。

@override
Widget build(BuildContext context) {
  return ColoredStatusBar(
    child: /* your child here */,
  );
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.