SystemChrome
官方类文档
官方对这个类的描述是

Controls specific aspects of the operating system's graphical interface and how it interacts with the application.

翻译一下

控制操作系统图形界面的特定方面,以及它如何与应用程序交互。

那么这个类具体是控制哪些东西呢?接下来我们一步一步的看。

方法和参数

先看下类提供的方法有如下5个static方法
1.setPreferredOrientations(List orientations) → Future
设置应用程序界面的方向集合。

2.setApplicationSwitcherDescription(ApplicationSwitcherDescription description) → Future
设置应用在最近任务栏的显示信息。

3.setEnabledSystemUIOverlays(List overlays) → Future
设置系统状态栏和导航栏是否显示

4.restoreSystemUIOverlays() → Future
将状态栏和导航栏还原到通过setEnabledSystemUIOverlays提供的最后设置 。当平台强制启用/禁用UI元素时可以使用。
实际开发中遇到一个问题,当设置应用全屏后,进入到有输入栏的界面,点击输入,弹出键盘后,状态栏和导航栏会出现,且不再消失。
解决办法是,使用插件keyboard_visibility监听键盘收起后,再调用restoreSystemUIOverlays()方法恢复。

5.setSystemUIOverlayStyle(SystemUiOverlayStyle style) → void
设置系统状态栏和导航栏(如果有)的样式。

以及一个参数
latestStyle,表示最近通过setSystemUIOverlayStyle方法设置的样式,作用是每次调用setSystemUIOverlayStyle方法时,先判断新设置的样式和上一次的样式是否一样,如果一样就直接返回,不一样才执行设置逻辑。

可以实现的功能

1.强制应用为竖屏(当系统开启了自动旋转功能时,手机横屏放置,应用依然保持竖屏)

代码使用

 //禁用横屏,强制竖屏
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
      DeviceOrientation.portraitDown,
    ]);

原理分析
方法setPreferredOrientations可以设置的方向有4个,分别是
竖直上 DeviceOrientation.portraitUp
竖直下 DeviceOrientation.portraitDown
水平左 DeviceOrientation.landscapeLeft
水平右 DeviceOrientation.landscapeRight
其中portraitUp是手机正常方向;landscapeLeft是手持手机正常方向,逆时针旋转90°;landscapeRight是手持手机正常方向,顺时针旋转90°;portraitDown是正常方向旋转180°;应用运行效果图如下

portraitUp,手机正常方向

portraitDown,将正常手机旋转180°。

landscapeLeft,将正常手机方向逆时针旋转90°。

landscapeRight,将正常手机方向顺时针旋转90°。

当应用方向被设置为portraitUp和portraitDown,应用就只有竖直方向,同理可以设置应用为横屏。

2设置应用在最近任务栏的显示信息

代码使用

SystemChrome.setApplicationSwitcherDescription(
        const ApplicationSwitcherDescription(
          label: 'history',
          primaryColor: 0x0000ff00,
        ));

其中label是显示在最近任务栏最上方的title,primaryColor是title的背景色(部分android手机没有效果,ios未实测)

3设置全屏

使用setEnabledSystemUIOverlays方法隐藏掉系统上方的状态栏和下方的导航栏,代码如下

SystemChrome.setEnabledSystemUIOverlays([]);

使用android手机实测时发现:
1.如果使用SystemChrome.setEnabledSystemUIOverlays([SystemUiOverlay.top]);
只显示状态栏,不显示导航栏,用户点击应用后,会立即出现导航栏,且不再隐藏
2.如果使用SystemChrome.setEnabledSystemUIOverlays([SystemUiOverlay.bottom]);
只显示导航栏,不显示状态栏,但是但用户手动拉出状态栏后,状态栏不再隐藏
3.如果使用SystemChrome.setEnabledSystemUIOverlays([]);
状态栏和导航栏都会隐藏,用户可以手动拉出状态栏和导航栏,在大约三秒后,系统又会隐藏掉状态栏和导航栏,以此实现全屏效果,不过在刘海屏和水滴屏上,状态栏会整个不显示,如图最上方的黑色部分(红色块设置的位置是在top left)

4.设置状态栏和导航栏的背景色

代码如下

SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark.copyWith(
          statusBarColor: Colors.red,
          systemNavigationBarColor: Colors.blue,
        ));

其中statusBarColor是状态栏,systemNavigationBarColor是导航栏,效果如图

SystemUiOverlayStyle还有其他几个参数,但是在用android机实测时,未发现有什么用

至此,SystemChrome相关的功能全部说完😃🤓