网易首页 > 网易号 > 正文 申请入驻

flutter系列之:查询设备信息的利器:MediaQuery

0
分享至

简介

移动的开发中,大家可能最头疼的就是不同设备的规格了,现在设备这么多,如何才能在诸多的设备中找到合适的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/ 最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现! 欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
黄仁勋和35岁女儿在台北吃饭,边吃边聊很温馨,混血高管厨艺不凡

黄仁勋和35岁女儿在台北吃饭,边吃边聊很温馨,混血高管厨艺不凡

译言
2026-05-27 08:40:12
以毒攻毒!德拉罗萨妻子:若把我丈夫移交海牙,就是马科斯的共犯

以毒攻毒!德拉罗萨妻子:若把我丈夫移交海牙,就是马科斯的共犯

窥史
2026-05-27 09:41:33
被网友们“低成本防蚊大法”惊到了!不花啥钱,让蚊子不敢靠近

被网友们“低成本防蚊大法”惊到了!不花啥钱,让蚊子不敢靠近

抠搜侠
2026-05-25 14:33:50
深圳男子买彩票中2亿,6天后去兑奖,却被工作人员赶了出去

深圳男子买彩票中2亿,6天后去兑奖,却被工作人员赶了出去

今天说故事
2025-05-28 14:49:59
北京家庭绿牌中签,十年后还能摇吗?

北京家庭绿牌中签,十年后还能摇吗?

生活魔术专家
2026-05-26 19:36:19
冯玉祥手握42万大军,实力仅次于蒋介石,为何却是最先被搞垮的?

冯玉祥手握42万大军,实力仅次于蒋介石,为何却是最先被搞垮的?

浩渺青史
2026-05-26 19:42:01
发生甚么事了?怀特塞德缺席昨日总决赛,CBA官网已无其名字

发生甚么事了?怀特塞德缺席昨日总决赛,CBA官网已无其名字

懂球帝
2026-05-27 08:54:37
李家鼎家产风波升级?港媒:交往马贯东他妈出手阔绰,李泳豪不满

李家鼎家产风波升级?港媒:交往马贯东他妈出手阔绰,李泳豪不满

悦君兮君不知
2026-05-27 09:32:03
张本智和父亲:我儿子已经来到世界第二,下一步就是灭了国乒!

张本智和父亲:我儿子已经来到世界第二,下一步就是灭了国乒!

拳击时空
2026-05-27 04:59:03
美国开始“赶人”?境内百万中国人,回国后可能十年进不来

美国开始“赶人”?境内百万中国人,回国后可能十年进不来

云舟史策
2026-05-26 07:15:41
瞎子阿炳:道士和寡妇的私生子,抽大烟逛青楼,为何能比肩贝多芬

瞎子阿炳:道士和寡妇的私生子,抽大烟逛青楼,为何能比肩贝多芬

老谢谈史
2026-05-24 02:17:43
深圳一住户家中凌晨发生火灾,宠物猫叫醒熟睡主人,一家人成功避险,猫咪不幸身亡

深圳一住户家中凌晨发生火灾,宠物猫叫醒熟睡主人,一家人成功避险,猫咪不幸身亡

爱下厨的阿酾
2026-05-27 12:27:02
建国后毛主席接见清朝禁卫军司令,笑道:长得不像征战沙场大将军

建国后毛主席接见清朝禁卫军司令,笑道:长得不像征战沙场大将军

零点历史说
2026-05-27 12:20:06
央地交流,侯延波赴任吉林!四川乐山市委书记赵波,已任甘孜州委书记!

央地交流,侯延波赴任吉林!四川乐山市委书记赵波,已任甘孜州委书记!

娱乐圈的笔娱君
2026-05-27 11:57:13
名记曝泽卡李源一合同到期后离队,剖析离队原因以及潜在下家

名记曝泽卡李源一合同到期后离队,剖析离队原因以及潜在下家

王大发不懂球
2026-05-27 06:47:53
唯一不与中国建交的邻国,首都离中国仅45公里,曾实行一妻多夫

唯一不与中国建交的邻国,首都离中国仅45公里,曾实行一妻多夫

抽象派大师
2026-05-17 02:10:48
每瓶仅含0.01克,喝几千瓶才抵一个桃!“饮料一哥”也翻车了?杭州多家超市在售,你可能也喝过

每瓶仅含0.01克,喝几千瓶才抵一个桃!“饮料一哥”也翻车了?杭州多家超市在售,你可能也喝过

都市快报橙柿互动
2026-05-24 20:48:16
刘星,任山西晋中市委书记

刘星,任山西晋中市委书记

上观新闻
2026-05-27 06:48:04
127-114!3-2输掉天王山,裁判扰战局!文班半场1篮板 3分5中0!

127-114!3-2输掉天王山,裁判扰战局!文班半场1篮板 3分5中0!

郝小小看体育
2026-05-27 11:42:29
布鲁斯·威利斯经典科幻片将下架,5月31日最后期限

布鲁斯·威利斯经典科幻片将下架,5月31日最后期限

时光慢旅人
2026-05-26 01:23:13
2026-05-27 13:43:00
flydean程序那些事
flydean程序那些事
最通俗的解读,最深刻的干货!
356文章数 438关注度
往期回顾 全部

科技要闻

韬定律:全球在卷纳米数 华为换了一把尺子

头条要闻

258亩荠菜地遭数百人哄抢造成损失约70万 种植户发声

头条要闻

258亩荠菜地遭数百人哄抢造成损失约70万 种植户发声

体育要闻

这群老阿姨,是最硬核的马刺球迷

娱乐要闻

小S晒归宁宴旧照,大S穿吊带裙扎丸子头

财经要闻

ST岩石退市背后:A股“炒壳”时代终结

汽车要闻

极狐问道V9今日将正式上市 搭载华为雪鸮增程系统

态度原创

本地
时尚
教育
公开课
军事航空

本地新闻

用剪纸的方式,打开江苏扬州

多巴胺“粉”,赫本是这样穿的!

教育要闻

江西现代职业技术学院:值得填报吗?热门专业就业现状及报考分析#搜索千校视频计划

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

特朗普称要和赖清德谈军售 国台办回应

无障碍浏览 进入关怀版