当前位置: 首页 > 知识库问答 >
问题:

如何在Flatter中更改状态栏和应用程序栏的颜色?

隗昀
2023-03-14

我正在尝试将系统状态栏的颜色更改为黑色。配置似乎被AppBar类覆盖。我可以通过在创建材料应用程序时将主题分配给ThemeData.dark(),然后指定一个appBar属性来实现我想要的。但是我不想要AppBar,而且,这样做会改变所有字体的颜色。

一种可能的解决方案是继承主题数据。将bright()添加到一个新类中,然后通过

setSystemUIOverlayStyle

然后我需要指定AppBar并以某种方式使其不可见?

文档

主要的飞奔

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:english_words/english_words.dart';
import 'layout_widgets.dart' as layout_widgets;

class RandomWords extends StatefulWidget {
  @override
  createState() => new RandomWordsState();
}
class RandomWordsState extends State<RandomWords> {
  final _suggestions = <WordPair>[];
  final _saved = new Set<WordPair>();
  final _biggerFont = const TextStyle(fontSize: 18.0);

  void _pushSaved() {
     Navigator.of(context).push(
       new MaterialPageRoute(
           builder: (context) {
             final tiles = _saved.map((pair) {
               return new ListTile(
                 title: new Text(pair.asPascalCase,style:_biggerFont)
               );
              }
             );
             final divided = ListTile.divideTiles(
               context:context,
                 tiles: tiles,).toList();
             return new Scaffold(
               appBar: new AppBar(
                 title: new Text('Saved Suggestions'),
               ),
               body: new ListView(children:divided),
             );
           }
       )
     );
  }

  Widget _buildSuggestions() {
    return new ListView.builder(
      padding: const EdgeInsets.all(16.0),
      // The item builder callback is called once per suggested word pairing,
      // and places each suggestion into a ListTile row.
      // For even rows, the function adds a ListTile row for the word pairing.
      // For odd rows, the function adds a Divider widget to visually
      // separate the entries. Note that the divider may be difficult
      // to see on smaller devices.
      itemBuilder: (context, i) {
        // Add a one-pixel-high divider widget before each row in theListView.
        if (i.isOdd) return new Divider();
        // The syntax "i ~/ 2" divides i by 2 and returns an integer result.
        // For example: 1, 2, 3, 4, 5 becomes 0, 1, 1, 2, 2.
        // This calculates the actual number of word pairings in the ListView,
        // minus the divider widgets.
        final index = i ~/ 2;
        // If you've reached the end of the available word pairings...
        if (index >= _suggestions.length) {
          // ...then generate 10 more and add them to the suggestions list.
          _suggestions.addAll(generateWordPairs().take(10));
        }
        return _buildRow(_suggestions[index]);
      }
    );
  }

  Widget _buildRow(WordPair pair) {
    final alreadySaved = _saved.contains(pair);
    return new ListTile(
      title: new Text(
          pair.asPascalCase,
        style: _biggerFont,
      ),
      trailing: new Icon(
        alreadySaved ? Icons.favorite : Icons.favorite_border,
        color: alreadySaved ? Colors.red : null,
      ),
      onTap: () {
        setState(() {
          if (alreadySaved) {
            _saved.remove(pair);
          } else {
            _saved.add(pair);
          }
        });
      },
    );
  }


  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Startup Name Generator'),
        actions: <Widget>[
          new IconButton(icon:new Icon(Icons.list), onPressed: _pushSaved),
        ],
      ),
      body: _buildSuggestions(),
    );
  }

}


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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    Column buildButtonColumn(IconData icon, String label) {
      Color color = Theme.of(context).primaryColor;
      return new Column(
        mainAxisSize: MainAxisSize.min,
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          new Icon(icon, color: color),
          new Container(
            margin: const EdgeInsets.only(top:8.0),
            child: new Text(
              label,
              style: new TextStyle(
                fontSize: 12.0,
                fontWeight: FontWeight.w400,
                color: color,
              )
            ),
          )
        ],

      );
    }
    Widget titleSection = layout_widgets.titleSection;
    Widget buttonSection = new Container(
      child: new Row(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: <Widget>[
          buildButtonColumn(Icons.contact_mail, "CONTACT"),
          buildButtonColumn(Icons.folder_special, "PORTFOLIO"),
          buildButtonColumn(Icons.picture_as_pdf, "BROCHURE"),
          buildButtonColumn(Icons.share, "SHARE"),
        ],
      )
    );
    Widget textSection = new Container(
      padding: const EdgeInsets.all(32.0),
      child: new Text(
        '''
The most awesome apps done here.
        ''',
        softWrap: true,
      ),
    );
    SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark);
    return new MaterialApp(
      title: 'Startup Name Generator',
//      theme: new ThemeData(
//          brightness: Brightness.dark,
//          primarySwatch: Colors.blue,
//      ),
//      theme: new ThemeData(),
      debugShowCheckedModeBanner: false,

      home: new Scaffold(
//        appBar: new AppBar(
////          title: new Text('Top Lakes'),
////          brightness: Brightness.light,
//        ),
//        backgroundColor: Colors.white,
        body: new ListView(
          children: [
            new Padding(
              padding: new EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 0.0),
              child: new Image.asset(
                  'images/lacoder-logo.png',
                  width: 600.0,
                  height: 240.0,
                  fit: BoxFit.fitHeight,

              ),
            ),

            titleSection,
            buttonSection,
            textSection,
          ],
        ),
      ),
    );
  }
}

布局工具。飞奔

import 'package:flutter/material.dart';

Widget titleSection = new Container(
    padding: const EdgeInsets.all(32.0),
    child: new Row(children: [
      new Expanded(
          child: new Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          new Container(
              padding: const EdgeInsets.only(bottom: 8.0),
              child: new Text(
                "Some-Website.com",
                style: new TextStyle(
                  fontWeight: FontWeight.bold,
                ),
              )
          ),
          new Text(
            'Small details',
            style: new TextStyle(
              color: Colors.grey[500],
            )
          )
        ],
      )),
      new Icon(Icons.star,color: Colors.orange[700]),
      new Text('100'),
    ]));

共有3个答案

终弘厚
2023-03-14

如果你根本不想要AppBar,那么你可以在主函数中调用setSystemMioVerlayStyle

void main() async {
  SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light);

  runApp(new MaterialApp(
    home: new Scaffold(),
  ));
}

如果你在一个脚手架上有一个应用程序条,而在另一个脚手架上没有,那就更棘手了。在这种情况下,在用一个没有appbar的脚手架推送新路线后,我不得不调用SetSystemEmioVerlayStyle

@override
Widget build(BuildContext context) {
  final page = ModalRoute.of(context);
  page.didPush().then((x) {
    SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light);
  });

  return new Scaffold();
}
公孙英飙
2023-03-14
Scaffold(
  appBar: AppBar(
    systemOverlayStyle: SystemUiOverlayStyle(
      systemNavigationBarColor: Colors.blue, // Navigation bar
      statusBarColor: Colors.pink, // Status bar
    ),
  ),
)

iOS和Android系统

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

仅适用于Android(更灵活)

您可以使用SystemChrome类更改状态栏和导航栏的颜色

import 'package:flutter/services.dart';

在这之后,您需要添加以下行(放置这些行的更好位置是main()方法)

void main() {
  SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
    systemNavigationBarColor: Colors.blue,
    statusBarColor: Colors.pink,
  ));
}
戚俊健
2023-03-14

我尝试了SystemChrome的方法。setSysteMioVerlayStyle(),据我测试(Flatter SDK v1.9.1热修复程序。2,在iOS 12.1上运行),它非常适合Android。但是对于iOS,例如,如果您的第一个屏幕FirstScreen()没有AppBar,但是第二个SecondScreen()有,那么在启动时,该方法会在FirstScreen()中设置颜色。但是,从SecondScreen()导航回FirstScreen()后,状态栏的颜色变为透明。

我想出了一个解决办法,将AppBar()设置为零高度,然后AppBar会改变状态栏的颜色,但AppBar本身不可见。希望这对某人有用。

// FirstScreen that doesn't need an AppBar
@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: PreferredSize(
        preferredSize: Size.fromHeight(0),
        child: AppBar( // Here we create one to set status bar color
          backgroundColor: Colors.black, // Set any color of status bar you want; or it defaults to your theme's primary color
        )
      )
  );
}

// SecondScreen that does have an AppBar
@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar()
  }
}

以下是iPhone Xs Max 12.1中的FirstScreen的屏幕截图iOS:

 类似资料:
  • 晚上好,伙计们。 我有个问题。我已经心神不定好长时间了。这里我有两个AScreen和BScreen屏幕。对于AScreen,我想要一个带有黑色图标的白色状态栏。对于BScreen,一个红色的状态栏,图标为白色。如何做到这一点?? 当我在屏幕A上时,我使用Flatter_statusbarcolo状态栏为红色,我导航到屏幕B状态栏为白色,但当我返回屏幕A时,状态栏保持白色(屏幕B的颜色)

  • 问题内容: 我想更改状态栏的颜色以匹配我的应用背景,该怎么办? 问题答案: 可以通过将CNS项目目录下的colors.xml文件包含以下示例内容来实现: 在这种情况下,colorPrimaryDark是您要为状态栏着色的颜色

  • 如何更改iPhone应用程序中标题部分(状态栏)的颜色。带有载体、时间和电池的部件。 这部分 更具体地说,这一部分。我想将UI从黑色改为白色或更容易看到的颜色。

  • 问题内容: 我正在尝试将状态栏的颜色更改为蓝色或其他某种颜色。 这可能吗,或者Apple不允许吗? 问题答案: 注意:此解决方案在iOS 13及更高版本下失败。 Plist中的第一个设置为 输出屏幕截图如下

  • 我在Flitter中的应用程序栏使用白色背景,如何将状态栏图标颜色更改为黑色, 我用这个代码来改变状态栏的颜色,

  • 问题内容: 我的应用程序具有深色背景,但是在iOS 7中状态栏变为透明的。所以我看不到任何东西,只有角落的绿色电池指示灯。如何将状态栏文本颜色更改为白色,就像在主屏幕上一样? 问题答案: 将要在文件的.plist。 在做一个 添加以下方法: { return UIStatusBarStyleLightContent; } 注意 :这不适用于内部控制器,请参阅下面的Tyson评论:) Swift 3