Flutter开发: 强大的MediaQuery控件

2020-04-0420:33:06APP与小程序开发Comments2,540 views字数 1775阅读模式

无特殊说明,Flutter版本及Dart版本如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18092.html

  • Flutter版本: 1.12.13+hotfix.5
  • Dart版本: 2.7.0

MediaQuery

通常情况下,不会直接将MediaQuery当作一个控件,而是使用MediaQuery.of获取当前设备的信息,用法如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18092.html

var data = MediaQuery.of(context);复制代码

此方式必须放在MediaQuery作用域内,否则会抛出异常,MaterialApp和WidgetsApp都引入了MediaQuery,并且随着屏幕的变化而导致重建,比如旋转屏幕、弹出输入框等。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18092.html

MediaQueryData

MediaQueryData是MediaQuery.of获取数据的类型。说明如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18092.html

属性说明
size逻辑像素,并不是物理像素,类似于Android中的dp,逻辑像素会在不同大小的手机上显示的大小基本一样,物理像素 = size*devicePixelRatio。
devicePixelRatio单位逻辑像素的物理像素数量,即设备像素比。
textScaleFactor单位逻辑像素字体像素数,如果设置为1.5则比指定的字体大50%。
platformBrightness当前设备的亮度模式,比如在Android Pie手机上进入省电模式,所有的App将会使用深色(dark)模式绘制。
viewInsets被系统遮挡的部分,通常指键盘,弹出键盘,viewInsets.bottom表示键盘的高度。
padding被系统遮挡的部分,通常指“刘海屏”或者系统状态栏。
viewPadding被系统遮挡的部分,通常指“刘海屏”或者系统状态栏,此值独立于paddingviewInsets,它们的值从MediaQuery控件边界的边缘开始测量。在移动设备上,通常是全屏。
systemGestureInsets显示屏边缘上系统“消耗”的区域输入事件,并阻止将这些事件传递给应用。比如在Android Q手势滑动用于页面导航(ios也一样),比如左滑退出当前页面。
physicalDepth设备的最大深度,类似于三维空间的Z轴。
alwaysUse24HourFormat是否是24小时制。
accessibleNavigation用户是否使用诸如TalkBack或VoiceOver之类的辅助功能与应用程序进行交互,用于帮助视力有障碍的人进行使用。
invertColors是否支持颜色反转。
highContrast用户是否要求前景与背景之间的对比度高, iOS上,方法是通过“设置”->“辅助功能”->“增加对比度”。 此标志仅在运行iOS 13的iOS设备上更新或以上。
disableAnimations平台是否要求尽可能禁用或减少动画。
boldText平台是否要求使用粗体。
orientation是横屏还是竖屏。

paddingviewPaddingviewInsets的区别如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18092.html

Flutter开发: 强大的MediaQuery控件文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18092.html

使用场景

根据尺寸构建不同的布局

SafeArea控件就是通过MediaQuery.of来实现的,平板和手机的(或者横屏和竖屏)布局可能是不一样的,比如如下布局:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18092.html

Flutter开发: 强大的MediaQuery控件布局代码如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18092.html

var screenSize = MediaQuery.of(context).size;
if(screenSize.width>oneColumnLayout){
  //平板布局
}else{
  //手机布局
}复制代码

oneColumnLayout表示一列布局的宽度。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18092.html

系统字体变化

很多App都有一个功能就是调节字体大小,通过MediaQuery来实现,实现如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18092.html

@override
  Widget build(BuildContext context) {
    var _data = MediaQuery.of(context).copyWith(textScaleFactor: 2.0);
    return Scaffold(
      appBar: AppBar(
        title: Text('老孟'),
      ),
      body: MediaQuery(
        data: _data,
        child: Text('字体变大'),
      ),
    );
  }复制代码

字体变大了一倍。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18092.html

作者:老孟程序员
链接:https://juejin.im/post/5e81ead56fb9a03c320b9c27
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18092.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/18092.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/xcx/18092.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定