Flutter MediaQuery详解

278 阅读2分钟

MediaQuery的属性

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

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

const MediaQueryData(
{
    this.size = Size.zero,//这里的size表示的是逻辑pixels的大小
    this.devicePixelRatio = 1.0, //表示的是一个物理像素代表多少个逻辑像素。devicePixelRatio并不要求是整数,比如在Nexus 6中,这个devicePixelRatio=3.5.
    this.textScaleFactor = 1.0,//表示一个逻辑像素能够表示多少个字体像素。或者你可以将其理解为字体的放大程度。比如textScaleFactor=1.5,那么它的意思是呈现出来的字体要比给定的字体大50%
    this.platformBrightness = Brightness.light, //表示的是设备的明亮程度。最常见的比如说明亮模式或者黑暗模式等
  
    this.viewInsets = EdgeInsets.zero, //指的是被系统UI所完全遮罩的部分,比如说我们在进行键盘输入的时候,会弹起键盘界面。
    this.padding = EdgeInsets.zero, //表示的是被系统UI所部分遮罩,并不能完全看见的部分,通常是系统状态栏,比如iphone中的刘海等。
    this.viewPadding = EdgeInsets.zero,//表示的是被系统UI所部分遮罩,并不能完全看见的部分,通常是系统状态栏,比如iphone中的刘海等。
    //这两者通常情况下是一样的,只有在出现键盘输入界面的时候两者就会发生不同。
    //简单来说,viewPadding是固定的,它的大小不会随键盘的显示而发生变化,Padding是可变化的,当键盘弹起,系统状态栏被遮罩的时候,它的bottom值就是0
    
    
  
    this.systemGestureInsets = EdgeInsets.zero, //是一个特殊的手势区域,在这个区域里面只能识别部分的手势指令,而不能识别所有的手势指令,所以需要这样的一个属性。
    
    this.alwaysUse24HourFormat = false, //表示是否使用24小时的时间格式
    this.accessibleNavigation = false, //表示用户是否使用了一些accessibility服务来和应用进行交互
    this.invertColors = false, 
    this.highContrast = false, 
    this.disableAnimations = false, 
    this.boldText = false, 
    this.navigationMode = NavigationMode.traditional,
})


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属性获得设备的宽度,然后根据设备的宽度跟特定的宽度进行对比,从而判断设备屏幕的大小。