03 获取状态栏高度和安全布局
如果你看过 MaterialApp
的源码,你应该会看到它的内部是一个 WidgetsApp
,而 WidgetsApp
内有一个 MediaQuery
,熟悉它的朋友知道我们可以通过 MediaQuery.of(context).size
去获取屏幕大小。
其实 MediaQuery
是一个 InheritedWidget
,它有一个叫 MediaQueryData
的参数,这个参数是通过如下图设置的,再通过源码我们知道,一般情况下 MediaQueryData
的 padding
的 top
就是状态栏的高度。
所以我们可以通过 MediaQueryData.fromWindow(WidgetsBinding.instance.window).padding.top
获取到状态栏高度,当然有时候可能需要考虑 viewInsets
参数。
至于 AppBar
的高度,默认是 Size.fromHeight(kToolbarHeight + (bottom?.preferredSize?.height ?? 0.0)),
,kToolbarHeight 是一个固定数据,当然你可以通过实现 PreferredSizeWidget
去自定义 AppBar
。
同时你可能会发现,有时候在布局时发现布局位置不正常,居然是从状态栏开始计算,这时候你需要用 SafeArea
嵌套下,至于为什么,看源码你就会发现 MediaQueryData
的存在。
学员评价