简介

挪动的开发中,大家可能最头疼的就是不同设施的规格了,当初设施这么多,如何能力在诸多的设施中找到适合的widget的地位来进行绘制呢?

不必怕,在flutter中为咱们提供了一个叫做MediaQuery的利器,大家一起来看看吧。

MediaQuery详解

MediaQuery从名字上来看,它的意思是媒体查问。它能够查问的货色就多了,能够查问以后你app的窗口信息,查问你指定的某个widget的信息等等,十分的弱小。

咱们先来看下MediaQuery到底是什么。 具体来说MediaQuery继承自InheritedWidget:

class MediaQuery extends InheritedWidget 

那么什么是InheritedWidget呢?为什么MediaQuery须要继承InheritedWidget呢?

很多时候,咱们须要从widget的子widget中获取到父widget对象,InheritedWidget就是一个能够提供简略获取办法的对象。

在InheritedWidget中能够实现of办法,通过调用BuildContext.dependOnInheritedWidgetOfExactType来从context中获取最邻近的InheritedWidget对象。

这里,因为MediaQuery是一个媒体查问工具,所以咱们可能须要在很多中央随时随地的进行对象的获取,那么这里应用InheritedWidget就是再好不过了。

MediaQuery的属性

MediaQuery的自有属性只有两个,别离是MediaQueryData类型的data和Widget类型的child。

MediaQueryData是一个相似于构造体的类,用来存储各种Media的状态信息。

咱们先来看下MediaQueryData的构造函数:

const MediaQueryData({    this.size = Size.zero,    this.devicePixelRatio = 1.0,    this.textScaleFactor = 1.0,    this.platformBrightness = Brightness.light,    this.padding = EdgeInsets.zero,    this.viewInsets = EdgeInsets.zero,    this.systemGestureInsets = EdgeInsets.zero,    this.viewPadding = EdgeInsets.zero,    this.alwaysUse24HourFormat = false,    this.accessibleNavigation = false,    this.invertColors = false,    this.highContrast = false,    this.disableAnimations = false,    this.boldText = false,    this.navigationMode = NavigationMode.traditional,  })

能够看到,MediaQueryData中蕴含了很多有用的属性,咱们来具体看一下具体的内容。

首先是示意media logical pixels大小的size。大家要留神的是,这里的size示意的是逻辑pixels的大小。

有logical pixels,就有Physical pixels,前者示意的逻辑大小,在任何设施上都是一样的,而后者示意的是实在的物理设施所反对的像素大小。这两种是能够不同的。一个物理像素可能代表多个逻辑像素,这个对应关系就是由devicePixelRatio这个属性来决定的。

devicePixelRatio示意的是一个物理像素代表多少个逻辑像素。devicePixelRatio并不要求是整数,比方在Nexus 6中,这个devicePixelRatio=3.5。

接下来是textScaleFactor,示意一个逻辑像素可能示意多少个字体像素。或者你能够将其了解为字体的放大水平。

比方textScaleFactor=1.5,那么它的意思是出现进去的字体要比给定的字体大50%。

而后是platformBrightness,示意的是设施的亮堂水平。最常见的比如说亮堂模式或者光明模式等。

viewInsets指的是被零碎UI所齐全遮罩的局部,比如说咱们在进行键盘输入的时候,会弹起键盘界面。

padding示意的是被零碎UI所局部遮罩,并不能齐全看见的局部,通常是零碎状态栏,比方iphone中的刘海等。

viewPadding示意的是被零碎UI所局部遮罩,并不能齐全看见的局部,通常是零碎状态栏,比方iphone中的刘海等。

哇喔,看起来padding和viewPadding是一样的,那么事实是否如此呢?

这两者通常状况下是一样的,只有在呈现键盘输入界面的时候两者就会产生不同。

简略来说,viewPadding是固定的,它的大小不会随键盘的显示而发生变化,Padding是可变动的,当键盘弹起,零碎状态栏被遮罩的时候,它的bottom值就是0。

systemGestureInsets是一个非凡的手势区域,在这个区域外面只能辨认局部的手势指令,而不能辨认所有的手势指令,所以须要这样的一个属性。

alwaysUse24HourFormat示意是否应用24小时的工夫格局。

accessibleNavigation示意用户是否应用了一些accessibility服务来和利用进行交互。

还有其余的一些属性比方highContrast,disableAnimations,boldText,navigationMode和orientation等根底的属性能够应用。

MediaQuery的另外一个属性就是child了。

MediaQuery的构造函数

MediaQuery除了最惯例的构造函数之外,还有三个构造函数,别离是MediaQuery.removePadding,MediaQuery.removeViewInsets和MediaQuery.removeViewPadding。

这三个构造函数都是通过传入一个指定的context和child来结构MediaQuery,然而他们都相应的移出了一些属性。依据名字就可以看进去,这三个别离移出的是padding,viewInsets和viewPadding。

咱们以removePadding为例,看一下具体的实现流程:

  factory MediaQuery.removePadding({    Key? key,    required BuildContext context,    bool removeLeft = false,    bool removeTop = false,    bool removeRight = false,    bool removeBottom = false,    required Widget child,  }) {    return MediaQuery(      key: key,      data: MediaQuery.of(context).removePadding(        removeLeft: removeLeft,        removeTop: removeTop,        removeRight: removeRight,        removeBottom: removeBottom,      ),      child: child,    );  }

removePadding办法须要传入四个额定的参数来示意是否须要移出padding的left,top,right或者bottom。

咱们能够看到返回了一个新的MediaQuery,其中data局部应用了MediaQuery.of(context)来获取context最近的MediaQuery,而后调用它的removePadding办法将对应的padding属性删除。

MediaQuery的应用

讲完MediaQuery的构造函数,接下来咱们看一下MediaQuery罕用的应用场景。

其实MediaQuery最常见的用途就是来判断设施的大小,从而依据不同设施的大小来进行页面的调整。

比方上面的getSize办法:

enum ScreenSize { Small, Normal, Large, ExtraLarge }ScreenSize getSize(BuildContext context) {  double deviceWidth = MediaQuery.of(context).size.shortestSide;  if (deviceWidth > 900) return ScreenSize.ExtraLarge;  if (deviceWidth > 600) return ScreenSize.Large;  if (deviceWidth > 300) return ScreenSize.Normal;  return ScreenSize.Small;}

咱们通过MediaQuery.of(context)拿到MediaQuery,而后通过size的shortestSide属性取得设施的宽度,而后依据设施的宽度跟特定的宽度进行比照,从而判断设施屏幕的大小。

当然,MediaQuery还能够用在其余须要检测Media属性的中央,大家能够认真领会。

总结

MediaQuery是flutter中一个十分不便的工具,用来检测media的属性状况,依据MediaQuery,咱们能够做出更加富裕交互性的APP。

更多内容请参考 http://www.flydean.com/50-flutter-mediaquery/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」,懂技术,更懂你!