Làm cách nào để thay đổi màu thanh trạng thái trong Flutter?


Câu trả lời:


119

Hoạt động hoàn toàn tốt trong ứng dụng của tôi

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),
    );
  }
}

( gói này )

UPD: Một giải pháp khác

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

8
Rất cảm ơn Andrey; Nó hoạt động ... vấn đề duy nhất là nền màu trắng nhưng đồng hồ, không dây và văn bản và biểu tượng khác cũng có màu trắng .. Tôi không chắc tại sao !! (Tôi đang mong đợi văn bản và các biểu tượng có màu đen)
Mohamed Hassan

1
Tôi cũng không tìm thấy điều này. Và tôi đã chỉnh sửa bài - có một giải pháp đơn giản và để thiết lập màu sắc thanh trạng thái
Andrey Turkovsky

1
Tuyệt vời. Chỉ một chút nhận xét ... Bạn phải mở tệp pubspec.yaml và thêm dòng tiếp theo bên dưới dòng phụ thuộc : flats_statusbarcolor: ^ 0.2.3 (Kiểm tra phiên bản cuối cùng tại đây [ pub.dev/packages/flutter_statusbarcolor#-installing-tab -] )
hfunes.com

1
@JayTillu không. Đối với iOS, bạn phải sử dụng flutter_statusbarcolorhoặc đặt màu cho từng màu AppBartheo cách thủ công
Andrey Turkovsky

1
nó thay đổi nền của thanh trạng thái, không phải văn bản của chính thanh trạng thái.
Abdulrahman Masoud

95

Cập nhật khuyến cáo):

Trên phiên bản Flutter mới nhất, bạn nên sử dụng:

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

Chỉ Android (linh hoạt hơn):

import 'package:flutter/services.dart';

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

Cả iOS và Android:

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

Tôi là người mới bắt đầu và tôi muốn biết Điều gì sẽ xảy ra nếu chúng tôi đưa những dòng này vào phương pháp xây dựng của bất kỳ widget nào? Liệu nó có bất kỳ sự khác biệt ?
Bhavnik

Nó sẽ hoạt động và không tạo ra bất kỳ sự khác biệt nào. Chỉ cần ghi nhớ, màu sắc sẽ được thiết lập với các thông số của người gọi mới nhất.
Yaobin Sau đó,

Làm cách nào để thay đổi màu văn bản trên thanh trạng thái khi thay đổi chủ đề ứng dụng từ sáng sang tối và ngược lại? Có thuộc tính nào trong lớp ThemeData không?
Vinoth Vino

@VinothVino Rất tiếc, bạn không thể cung cấp màu văn bản mà bạn chọn cho các mục trên thanh trạng thái, tất cả những gì bạn có thể làm là thay đổi brightness, nơi Brightness.lighthiển thị màu văn bản đen và Brightness.darkhiển thị màu trắng.
CopsOnRoad vào

Cảm ơn người anh em đã trả lời. Làm cách nào để thay đổi độ sáng động? Tôi đang thay đổi chế độ tối, nó không cập nhật đúng cách. Nếu tôi nóng khởi động lại ứng dụng thì nó hoạt động.
Vinoth Vino

46

Thay vì thường được đề xuất SystemChrome.setSystemUIOverlayStyle()là một dịch vụ trên toàn hệ thống và không đặt lại trên một lộ trình khác, bạn có thể sử dụng AnnotatedRegion<SystemUiOverlayStyle>một tiện ích là một tiện ích và chỉ có hiệu lực cho tiện ích mà bạn kết hợp.

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

1
Đây là câu trả lời tốt nhất, vì việc bật trở lại màn hình sau một lần nhấn sẽ đặt lại thanh trạng thái. Điều này lần đầu tiên được đề cập bởi Jordy tại đây stackoverflow.com/a/54593164/4033525
Sameer J

1
Tôi cũng tin rằng đây là câu trả lời tốt nhất nếu chúng ta cần nó trong suốt ứng dụng
Abbas

1
Tôi đang sử dụng nó trong một màn hình và nó có hiệu lực trên tất cả các màn hình khác trong ứng dụng. Tôi đang sử dụng nó trên màn hình đầu tiên và tự nhiên các màn hình khác được kết nối nên nó có cùng màu thanh trạng thái, màu trắng này, trên tất cả các màn hình khác. Làm thế nào để ngăn chặn hành vi này? Làm thế nào để nó chỉ hoạt động trên một giàn giáo cụ thể?
gegobyte

@gegobyte Tôi đã gặp vấn đề tương tự. những gì tôi đã làm là sử dụng 1 màu toàn cục, màu này được sử dụng trong hầu hết các chế độ xem. Nhưng trong cái nhìn cụ thể, nơi là cần thiết màu sắc khác nhau, tôi chỉ cần sử dụng lại cùng phụ tùng nhưng với màu sắc khác nhau
Andris

44

Đối với những người sử dụng AppBar

Nếu bạn sử dụng AppBarthì việc cập nhật màu thanh trạng thái đơn giản như sau:

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

Để áp dụng cho tất cả các thanh ứng dụng:

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

Đối với những người không sử dụng AppBar

Gói nội dung của bạn bằng AnnotatedRegionvà đặt valuethành SystemUiOverlayStyle.lighthoặc SystemUiOverlayStyle.dark:

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

2
Phương pháp này không cho phép để thiết lập màu sắc chính xác
kashlo

nếu bạn muốn có màu thanh trạng thái theo chủ đề của mình, bạn luôn có thể sử dụngbrightness: Theme.of(context).brightness
Roman Panaget

1
value: SystemUiOverlayStyle.light(hoặc .dark) làm điều tương tự
chết tiệt

12

Thay đổi màu thanh trạng thái khi bạn không sử dụng AppBar

Đầu tiên nhập cái này

import 'package:flutter/services.dart';

Bây giờ, hãy sử dụng mã bên dưới để thay đổi màu thanh trạng thái trong ứng dụng của bạn khi bạn không sử dụng 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. */
); 

Để thay đổi màu thanh trạng thái iOSkhi bạn đang sử dụngSafeArea

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

Tôi bị bắt bằng cách đặt SafeArea trước giàn giáo để ngăn màu nền từ giàn giáo mở rộng ra phía sau thanh trạng thái.
Bulwinkel

8

Tôi không thể bình luận trực tiếp trong chủ đề vì tôi chưa có danh tiếng cần thiết, nhưng tác giả đã hỏi như sau:

vấn đề duy nhất là nền màu trắng nhưng đồng hồ, không dây và các văn bản và biểu tượng khác cũng có màu trắng .. Tôi không chắc tại sao !!

Đối với bất kỳ ai khác đến chủ đề này, đây là những gì đã làm việc cho tôi. Màu văn bản của thanh trạng thái được quyết định bởi hằng số Độ sáng trong flutter/material.dart. Để thay đổi điều này, hãy điều chỉnh SystemChromegiải pháp như vậy để định cấu hình văn bản:

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

Giá trị có thể của bạn cho BrightnessBrightness.darkBrightness.light.

Tài liệu: https://api.flutter.dev/flutter/dart-ui/Brightness-class.html https://api.flutter.dev/flutter/services/SystemUiOverlayStyle-class.html


8

Điều này đã làm việc cho tôi:

Dịch vụ nhập khẩu

import 'package:flutter/services.dart';

Sau đó thêm:

@override
  Widget build(BuildContext context) {

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

6

Tôi nghĩ điều này sẽ giúp bạn:

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

Đây là mọi thứ bạn cần biết:

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

Nó có thể đạt được trong 2 bước:

  1. Đặt màu thanh trạng thái để phù hợp với nền trang của bạn bằng gói FlutterStatusbarcolor
  2. Đặt màu sắc của các nút trên thanh trạng thái (pin, wifi, v.v.) bằng cách sử dụng thuộc AppBar.brightnesstính

Nếu bạn có AppBar:

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

Nếu bạn không muốn hiển thị thanh ứng dụng trong trang:

  @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()
  }

cái này cũng được thử nghiệm cho SafeArea trong iOS?
LOG_TAG

3

trên dịch vụ nhập tệp main.dart như sau

  import 'package:flutter/services.dart';

và phương thức xây dựng bên trong chỉ cần thêm dòng này trước khi trả về

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

Như thế này:

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

2

Cái này cũng sẽ hoạt động

SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark);
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light);

2
 return Scaffold(
      backgroundColor: STATUS_BAR_COLOR_HERE,
      body: SafeArea(
        child: scaffoldBody(),
      ),
);

2

Đây là cách tốt nhất cho đến nay, nó không yêu cầu thêm plugin.

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

và gọi nó trong giàn giáo của bạn như thế này

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

1

để làm cho nó giống như màu thanh ứng dụng của bạn

import 'package:flutter/material.dart';

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

1

Hoạt động cho cả iOS và 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
Vui lòng không chỉ đăng mã như một câu trả lời, mà hãy cung cấp lời giải thích mã của bạn có chức năng gì và cách nó giải quyết vấn đề của câu hỏi. Các câu trả lời kèm theo lời giải thích thường có chất lượng cao hơn và có nhiều khả năng thu hút sự ủng hộ hơn.
Mark Rotteveel

0

Tôi gặp vấn đề với tất cả các câu trả lời được đề cập, ngoại trừ giải pháp mà tôi đã tự làm: Container(width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).padding.top, color: Colors.green) Đối với các chế độ xem, không có appBar nào được thêm vào, tôi chỉ sử dụng vùng chứa có nền có chiều cao chính xác khớp với chiều cao thanh trạng thái. Trong trường hợp này, mỗi chế độ xem có thể có màu trạng thái khác nhau và tôi không cần phải lo lắng và suy nghĩ về một số logic, rằng chế độ xem sai bằng cách nào đó có màu sắc sai.


0

Không có giải pháp hiện có nào giúp được tôi, bởi vì tôi không sử dụng AppBarvà tôi không muốn đưa ra tuyên bố bất cứ khi nào người dùng chuyển đổi chủ đề ứng dụng. Tôi cần một cách phản ứng để chuyển đổi giữa chế độ sáng và tối và nhận thấy rằng nó AppBarsử dụng một tiện ích con được gọi là Semanticsđể thiết lập màu thanh trạng thái.

Về cơ bản, đây là cách tôi thực hiện:

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được nhập khẩu từ package:flutter/material.dart.
  • SystemUiOverlayStyleđược nhập khẩu từ package:flutter/services.dart.

phải đối mặt với vấn đề tương tự như đã đề cập ở trên, nhưng giải pháp này sẽ không làm việc trong Andorid 10
Aditi

0

Tôi đã giải quyết nó bằng cách thay đổi toàn bộ màu nền như sau:

Trong màn hình chính:

return Scaffold (

  backgroundColor: Colors.black,

  body: SafeArea(
  
 ),

);


0

Hầu hết các câu trả lời là sử dụng SystemChromechỉ hoạt động cho Android. Giải pháp của tôi là kết hợp cả hai AnnotatedRegionSafeAreathành Widget mới để nó cũng hoạt động trong iOS. Và tôi có thể sử dụng nó có hoặc không 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,
          ),
        ),
      ),
    );
  }
}

Cách sử dụng: Đặt nó lên đầu tiện ích của trang.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.