在我的Flutter应用中,屏幕A没有AppBar。
因此,我在构建中称为SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark)
。
按下并弹出具有AppBar的另一个屏幕B之后,
屏幕A上的指示灯状态栏。
我希望系统用户界面在弹出屏幕时返回到原始设置。
最佳答案
其背后的原因是您的新屏幕将具有其自己的生命周期,因此可能在状态栏上使用其他颜色。
您可以在SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark)
方法中调用initState
,但是在弹出堆叠屏幕后不会触发。这里有两个问题,但是您可以从屏幕pop()
返回后再次调用。很简单吧?差不多好了。
当您按下AppBar
小部件上的后退按钮时,即使仍从堆叠屏幕渲染导航动画,也会立即从Navigator.of(context).push(someroute)
返回。
要解决此问题,您可以添加一些“调整”,将在500毫秒后再次设置状态栏颜色,这足以使动画完全完成。因此,您将或多或少需要这样的东西:
class HomeScreen extends StatefulWidget {
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
@override
void initState() {
_updateAppbar();
super.initState();
}
void _updateAppbar() {
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark);
}
@override
Widget build(BuildContext context) {
return Container(
child: RaisedButton(
child: Text('Navigate to second screen'),
onPressed: () => Navigator.of(context)
.push(MaterialPageRoute(builder: (BuildContext context) => SecondScreen()))
.whenComplete(() => Future.delayed(Duration(milliseconds: 500)).then((_) => _updateAppbar()))));
}
}
class SecondScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
);
}
}
尽管这可行,但是我仍然很好奇是否有人知道一种更好的方法来处理此问题,并保持状态栏颜色绑定(bind)到每个屏幕。