Flutter 94: 初識 MediaQuery

??????當我們同時為手機和平板適配編寫 app 針對不同屏幕尺寸進行 UI 布局或當用戶偏好設(shè)置較大字號或是想要最大限度等減少動畫等摊腋;此時就需要 MediaQuery 來幫我們獲取所用設(shè)備的信息以及用戶設(shè)置的偏好信息;

MediaQuery

??????MediaQuery 一直存在于 WidgetsAppMaterialApp 中工禾,MediaQuery 繼承自 InheritedWidget 是一個單獨的 Widget锉走,但一般通過 MediaQuery.of(context) 來獲取相關(guān)信息缀旁;

??????當相關(guān)信息發(fā)生變化觅丰,例如屏幕旋轉(zhuǎn)等時翰铡,屏幕中 Widget 會重新構(gòu)建钝域,以保持最新狀態(tài);我們可以通過 MediaQuery 構(gòu)造函數(shù)和提供的靜態(tài)方法手動設(shè)置對應(yīng)的相關(guān)信息锭魔;

1. MediaQuery()

const MediaQuery({
    Key key,
    @required this.data,
    @required Widget child,
})

2. MediaQuery.removePadding() 刪除內(nèi)邊距

factory MediaQuery.removePadding({
    Key key,
    @required BuildContext context,
    bool removeLeft = false,
    bool removeTop = false,
    bool removeRight = false,
    bool removeBottom = false,
    @required Widget child,
})

3. MediaQuery.removeViewInsets() 刪除視圖內(nèi)邊距

factory MediaQuery.removeViewInsets({
    Key key,
    @required BuildContext context,
    bool removeLeft = false,
    bool removeTop = false,
    bool removeRight = false,
    bool removeBottom = false,
    @required Widget child,
})

MediaQueryData

??????MediaQueryData 包含關(guān)于媒介的相關(guān)信息例证;一般通過 MediaQuery.of(context) 獲取迷捧;

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.physicalDepth = double.maxFinite,
    this.alwaysUse24HourFormat = false,
    this.accessibleNavigation = false,
    this.invertColors = false,
    this.highContrast = false,
    this.disableAnimations = false,
    this.boldText = false,
});

1. size

??????size 為媒介的尺寸大小织咧,以邏輯像素為單位胀葱;

print('屏幕 Size -> ${MediaQuery.of(context).size}');

print('按鈕 Size -> ${_itemExpandedKey.currentContext.size}');
print('文字 Size -> ${_itemTextKey.currentContext.size}');
print('文字 Size -> ${MediaQuery.of(_itemTextKey.currentContext).size}');

2. devicePixelRatio

??????devicePixelRatio 為像素密度;與設(shè)備物理像素有關(guān)笙蒙,與橫豎屏等無關(guān)抵屿;

print('屏幕像素比 -> ${MediaQuery.of(context).devicePixelRatio}');

3. orientation

??????orientation 為橫豎屏,Orientation.landscape 為橫屏手趣,Orientation.portrait 為豎屏晌该;

print('橫豎屏 -> ${MediaQuery.of(context).orientation}');

4. textScaleFactor

??????textScaleFactor
每個邏輯像素的字體像素數(shù),小菜理解為字體的像素比绿渣;注意朝群,小菜設(shè)置了默認字體像素密度為標準的 1.2 倍之后調(diào)整設(shè)備系統(tǒng)字號,其 1.2 倍依舊是以標準字號為基礎(chǔ)擴大 1.2 倍中符;

print('字體像素比 -> ${MediaQuery.of(context).textScaleFactor}');

MediaQuery(data: MediaQuery.of(context).copyWith(textScaleFactor: 1.2),
    child: Text('字體像素比 * 1.2', style: TextStyle(color: Colors.white, fontSize: 16.0));
print('字體像素比 * 1.2 -> ${MediaQuery.of(context).copyWith(textScaleFactor: 1.2).textScaleFactor}');

5. platformBrightness

??????platformBrightness 為當前設(shè)備的亮度模式姜胖;注意調(diào)整屏幕亮度并不會改變該模式,與當前系統(tǒng)支持的黑暗模式和明亮模式相關(guān)淀散;

print('亮度模式 -> ${MediaQuery.of(context).platformBrightness}');

6. alwaysUse24HourFormat

??????alwaysUse24HourFormat 為當前設(shè)備是否為 24 小時制右莱;

print('24 小時制 -> ${MediaQuery.of(context).alwaysUse24HourFormat}');

7. accessibleNavigation

??????accessibleNavigation 為是否使用 TalkBackVoiceOver 之類的輔助功能與應(yīng)用程序進行交互,用以輔助視力障礙人群档插;

print('亮度模式 -> ${MediaQuery.of(context).accessibleNavigation}');

8. invertColors

??????invertColors 為是否使用顏色反轉(zhuǎn)慢蜓,主要用于 iOS 設(shè)備;

print('顏色反轉(zhuǎn) -> ${MediaQuery.of(context).invertColors}');

9. highContrast

??????highContrast 為用戶是否要求前景與背景之間的對比度高郭膛,主要用于 iOS 設(shè)備晨抡;

print('前后背景高對比度 -> ${MediaQuery.of(context).highContrast}');

10. disableAnimations

??????disableAnimations 為平臺是否要求禁用或減少動畫;

print('是否減少動畫 -> ${MediaQuery.of(context).disableAnimations}');

11. boldText

??????boldText 為平臺是否要求使用粗體则剃;

print('是否使用粗體 -> ${MediaQuery.of(context).boldText}');

12. padding

??????padding 為屏幕內(nèi)邊距耘柱,一般是劉海兒屏或異形屏中被系統(tǒng)遮擋部分邊距;

print('內(nèi)邊距 -> ${MediaQuery.of(context).padding}');

13. viewInsets

??????viewInsets 為鍵盤彈出時等遮擋屏幕邊距棍现,其中 viewInsets.bottom 為鍵盤高度调煎;

print('鍵盤遮擋內(nèi)邊距 -> ${MediaQuery.of(context).viewInsets}');

14. systemGestureInsets

??????systemGestureInsets 為手勢邊距,如 Android Q 之后添加的向左滑動關(guān)閉頁面等己肮;

print('系統(tǒng)手勢邊距 -> ${MediaQuery.of(context).systemGestureInsets}');

15. viewPadding

??????viewPadding 小菜理解為視圖內(nèi)邊距士袄,為屏幕被劉海兒屏或異形屏中被系統(tǒng)遮擋部分,從 MediaQuery 邊界的邊緣計算谎僻;此值是保持不變窖剑;例如,屏幕底部的軟件鍵盤可能會覆蓋并占用需要底部填充的相同區(qū)域戈稿,因此不會影響此值西土;

print('系統(tǒng)手勢邊距 -> ${MediaQuery.of(context).systemGestureInsets}');

16. physicalDepth

??????physicalDepth 為設(shè)備物理層級,小菜暫時還未想到對應(yīng)的應(yīng)用場景鞍盗;

print('設(shè)備物理層級 -> ${MediaQuery.of(context).physicalDepth}');

Tips

??????小菜在嘗試獲取其他子 Widget Size 時需了,有兩點需要注意跳昼,首先要設(shè)置一個全局的 GlobalKey 來獲取當前位置,key 需要為唯一的肋乍;第二通過 GlobalKey().currentContext 獲取 BuildContext 上下文環(huán)境鹅颊,從而獲取對應(yīng)尺寸;

var _itemExpandedKey = GlobalKey();
var _itemTextKey = GlobalKey();

Expanded(
    key: _itemExpandedKey,
    child: FlatButton(
        onPressed: () => _itemClick(2),
        child: Center(child: Text('按鈕 Size', key: _itemTextKey, style: TextStyle(color: Colors.white, fontSize: 16.0))),
        color: Colors.purpleAccent.withOpacity(0.4)))

??????MediaQuery 案例嘗試


??????小菜對于部分 MediaQueryData 的應(yīng)用和理解還不夠深入墓造;如有錯誤請多多指導堪伍!

來源: 阿策小和尚

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市觅闽,隨后出現(xiàn)的幾起案子帝雇,更是在濱河造成了極大的恐慌,老刑警劉巖蛉拙,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件用狱,死亡現(xiàn)場離奇詭異尔店,居然都是意外死亡介褥,警方通過查閱死者的電腦和手機逾礁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畸肆,“玉大人宦芦,你說我怎么就攤上這事≈崞辏” “怎么了踪旷?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長豁辉。 經(jīng)常有香客問我,道長舀患,這世上最難降的妖魔是什么徽级? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮聊浅,結(jié)果婚禮上餐抢,老公的妹妹穿的比我還像新娘。我一直安慰自己低匙,他們只是感情好旷痕,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著顽冶,像睡著了一般欺抗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上强重,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天绞呈,我揣著相機與錄音贸人,去河邊找鬼。 笑死佃声,一個胖子當著我的面吹牛艺智,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播圾亏,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼十拣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了志鹃?” 一聲冷哼從身側(cè)響起夭问,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弄跌,沒想到半個月后甲喝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡铛只,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年埠胖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淳玩。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡直撤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜕着,到底是詐尸還是另有隱情谋竖,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布承匣,位于F島的核電站蓖乘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏韧骗。R本人自食惡果不足惜嘉抒,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望袍暴。 院中可真熱鬧些侍,春花似錦、人聲如沸政模。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淋样。三九已至耗式,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纽什。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工措嵌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芦缰。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓企巢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親让蕾。 傳聞我的和親對象是個殘疾皇子浪规,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容