使用内容图像视图的时候,我们可以把系统的状态栏还有底部导航栏隐藏起来。打开 post_image_view,把这个小部件转换成一个 StatefulWidget,然后添加一个 initState 方法,在这个方法里面,用一下 SystemChrome ,这个东西来自 flutter 的 services 。
用一下 setEnabledSystemUIMode ,设置一下系统界面模式,提供一个 SystemUiMode.immersiveSticky,这种模式会隐藏状态栏还有底部导航栏。
扔掉这个小部件的时候再恢复一下系统界面模式,添加一个 dispose ,同样用一下 SystemChrome.setEnabledSystemUIMode,设置成 SystemUiMode.manual ,手工设置需要的东西,再提供一个 overlays,它是一个列表,里面添加一个 SystemUiOverlay.top ,系统状态栏,再添加一个 SystemUiOverlay.bottom,底部导航栏。
测试
观察一下应用的界面,你会发现在内容图像视图这里,系统的状态栏就不再显示了。再退回到列表页面,这个状态栏又会显示出来。
现在有个问题,就是如果我们再次打开一个内容页面的时候,状态栏会闪一下,这是因为,使用内容图像视图的时候,媒体比例的值是 0 ,打开内容页面的时候虽然会恢复媒体比例,但一开始会创建一个 PostImageView 小部件,创建这个小部件就会隐藏状态栏,恢复了媒体比例以后,扔掉了 PostImageView 以后又会显示状态栏。所以会闪动一下。
解决这个问题可以这样,我们可以把这个恢复媒体比例的动作放在 PostImageView 小部件里去做。
删除掉 PostShow 的 initState 方法里执行的 restoreMediaAspectRatio。然后打开 PostImageView,在 State 类里添加一个属性,用 late 标记一下,类型是 PostShowStore,名字是 postShowStore。
在 initState 里面,设置一下 postShowStore ,等于 context.read ,类型是 PostShowStore。在文件的顶部找个地方导入 provider 这个包。
然后在 dispose 方法里面,执行一下 postShowStore.restoreMediaAspectRatio 这个方法。
重新启动一下应用,再到模拟器测试一下。在列表页面,打开一个内容,再打开内容图像视图,然后回到内容列表,再打开一个内容页面。这次这个状态栏就不会再闪动一下了。