点击上方蓝字关注我,知识会给你力量

写过Android的开发者都知道,关于状态栏高度的计算,Google改了一版又一版,依然还有很多兼容性问题,那么来到Flutter这边,问题突然变得简单了,通过下面的方法就可以很方便的获取。

MediaQuery.of(context).padding.top

❝ 注释里有一句话非常关键,是一个重要的伏笔:If you consumed this padding (e.g. by building a widget that envelops or accounts for this padding in its layout in such a way that children areno longer exposed to this padding)。

❝ 老版本是MediaQueryData.fromWindow方法,3.7后废弃了。

注意到前面的注释了吗,If you consumed this padding (e.g. by building a widget that envelops or accounts for this padding in its layout in such a way that children areno longer exposed to this padding)。

所以,难道说是父布局消耗了这个padding?看不太懂,我们写一个简单的测试代码。

class _MyHomePageState extends State

  {   @override   Widget build(BuildContext context) {     print('外层获取状态栏高度:${MediaQuery.of(context).padding.top}');     return Scaffold(       appBar: AppBar(         backgroundColor: Theme.of(context).colorScheme.inversePrimary,         title: Text(widget.title),       ),       body: Builder(builder: (context) {         print('内层获取状态栏高度:${MediaQuery.of(context).padding.top}');         return const Text('data');       }),     );   } }

输出结果如下:

I/flutter (11316): 外层获取状态栏高度:32.0
I/flutter (11316): 内层获取状态栏高度:0.0

class _MyHomePageState extends State

  {   @override   Widget build(BuildContext context) {     print('外层获取状态栏高度:${MediaQuery.of(context).padding.top}');     return Scaffold(        // appBar: AppBar(        //   backgroundColor: Theme.of(context).colorScheme.inversePrimary,        //   title: Text(widget.title),        // ),       body: Builder(builder: (context) {         print('内层获取状态栏高度:${MediaQuery.of(context).padding.top}');         return const Text('data');       }),     );   } }

输出:

I/flutter (11316): 外层获取状态栏高度:32.0
I/flutter (11316): 内层获取状态栏高度:32.0

果不其然,现在可以获取了。

所以,其实算法就是:

WidgetsBinding.instance.window.padding.top / WidgetsBinding.instance.window.devicePixelRatio

但新版本WidgetsBinding.instance.window已经被废弃了,所以最新的方法应该是下面的这样。

double height = MediaQueryData.fromView(PlatformDispatcher.instance.views.first).padding.top;

通过这个方式,可以在任意context下拿到当前状态栏的高度,而不用关心padding的影响。至此,我们终于搞清楚了在Flutter中获取状态栏高度的来龙去脉,不得不说,Flutter最大的好处就是源码透明,我们可以很方便的追踪问题的根源,甚至在发现问题时,可以将源码直接copy出来进行修改。

向大家推荐下我的网站 https://www.yuque.com/xuyisheng 点击原文一键直达

专注 Android-Kotlin-Flutter 欢迎大家访问

本文原创公众号:群英传,授权转载请联系微信(Tomcat_xu),授权后,请在原创发表24小时后转载。

作者:徐宜生

更文不易,点个“三连”支持一下