setSystemUIOverlayStyle

setSystemUIOverlayStyle

在我的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)到每个屏幕。

10-07 19:25