我试图将系统状态栏的颜色更改为黑色。
配置似乎被AppBar类覆盖。我可以通过分配主题来实现我想要的:在创建Material App时ThemeData.dark()
,然后指定appBar attribute
。但我不想要一个AppBar,而且这样做会改变所有的字体颜色。
一种可能的解决方案是将ThemeData.bright()继承到新类中,然后添加仅通过
更改系统状态栏的内容setSystemUIOverlayStyle
然后我需要指定AppBar并让它以某种方式隐藏?
https://docs.flutter.io/flutter/services/SystemChrome/setSystemUIOverlayStyle.html
main.dart
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 itemBuilder 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,
],
),
),
);
}
}
layout_widgets.dart
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'),
]));
答案 0 :(得分:3)
您可以使用SystemChrome
类来更改状态栏和导航栏的颜色。
首次导入
import 'package:flutter/services.dart';
此后,您需要添加以下几行(放置这些行的更好的位置是您的main()
方法中)
void main() {
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
systemNavigationBarColor: Colors.blue,
statusBarColor: Colors.pink,
));
}
答案 1 :(得分:2)
如果您根本不想要AppBar,那么您只需在主要功能中调用setSystemUIOverlayStyle
:
void main() async {
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light);
runApp(new MaterialApp(
home: new Scaffold(),
));
}
如果你在一个脚手架中有一个应用栏,而在另一个脚手架中没有应用栏,那就更棘手了。在那种情况下,我不得不在推出一条没有appbar的脚手架的新路线后致电setSystemUIOverlayStyle
:
@override
Widget build(BuildContext context) {
final page = ModalRoute.of(context);
page.didPush().then((x) {
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light);
});
return new Scaffold();
}
答案 2 :(得分:1)
我对StackOverflow&amp;我从来没有使用Flutter但是我发现this包似乎使事情相对容易。
方法1:使用软件包
导入后,您需要做的就是添加以下代码片段:
try {
await FlutterStatusbarcolor.setStatusBarColor(Colors.black);
} on PlatformException catch (e) {
print(e);
}
替换setStatusBarColor()
的参数可以获得所需的结果,可以找到完整的颜色列表here。
方法2:使用默认功能
如果这不起作用/您不想添加额外的包或库,那么也许this StackOverflow答案可能会有所帮助。
它涉及使用与上述方法类似的功能:getWindow().setStatusBarColor()
或getActivity().getWindow().setStatusBarColor()
使用所需的十六进制代码from the same list as earlier替换参数也可能会产生解决方案。
希望它有效/有帮助!
答案 3 :(得分:1)
我已经做到了
@override
void initState() {
super.initState();
// Transparent status bar
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(statusBarColor: Colors.transparent,));
}
您还可以在逗号后看到不同的属性
SystemUiOverlayStyle(statusBarColor: Colors.transparent,)
只需在逗号后使用ctrl +空格的组合,您将获得可以使用的内容。
答案 4 :(得分:1)
请阅读此flutter package。要将状态栏文本设置为黑色,可以设置FlutterStatusbarcolor.setStatusBarWhiteForeground(false)
。您需要在didChangeAppLifecycleState
方法中将这行代码设为恢复状态,以便当您转到其他应用程序并返回时,状态栏文本颜色将设置为您的初始设置。 / p>
此外,您需要设置AppBar的TextTheme。就像以下。
Widget build(BuildContext context) {
FlutterStatusbarcolor.setStatusBarWhiteForeground(false);
return MaterialApp(
title:// title goes here
theme:// your theme goes here
home: Scaffold(
appBar: AppBar(
backgroundColor: Colors.white,
title: _loadAppBarTitle(),
textTheme: Theme.of(context).textTheme),
body: //body's goes here
);
);
希望这可以帮助与我有类似问题的人。
答案 5 :(得分:0)
我尝试了方法SystemChrome.setSystemUIOverlayStyle()
,据我测试(在iOS 12.1上运行的Flutter SDK v1.9.1 + hotfix.2),它非常适合Android。但对于iOS,例如如果您的第一个屏幕FirstScreen()
没有AppBar
,但是第二个屏幕SecondScreen()
有,则在启动时,该方法会在FirstScreen()
中设置颜色。但是,从FirstScreen()
导航回SecondScreen()
后,状态栏颜色变为透明。
我通过设置高度为AppBar()
的{{1}}来解决问题,但是状态栏的颜色会被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 iOS 12.1中FirstScreen
的屏幕截图:
答案 6 :(得分:0)
TLDR;您需要使用 Scaffold
,即使您来回导航,它也会管理颜色。
Scaffold(
appBar: AppBar(brightness: Brightness.dark), \\ dark content -> white app bar
body: ...
);
如果您的屏幕没有应用栏,那么您需要使用 AnnotatedRegion
with 脚手架以达到相同的效果。
AnnotatedRegion(
value: SystemUiOverlayStyle.light, // this will make the app bar white
child: Scaffold(
body:
),
);
您可以自定义它,而不是 SystemUiOverlayStyle.light
:
SystemUiOverlayStyle(
statusBarBrightness: Brightness.light,
systemNavigationBarDividerColor: Colors.blue,
...
);