一個Flutter widget自動適配不同UI到Web微渠、Android

上圖

webUI

androidUI

不是dp適配

對的,不是對dp的適配咧擂,而是在不同的分變率逞盆,改變布局的方式。大的屏幕肯定是要合理利用空間松申,這樣布局緊湊云芦,不浪費(fèi)空間,小的屏幕又不能讓大的組件等比壓縮贸桶,這樣不光會變丑舅逸,還會變的更難觸及,既然Flutter對web的支持皇筛,那么肯定要支持不同分辨率琉历,適配不同布局吧,就像我們Android開發(fā)设联,在針對Pad的時(shí)候做一個單獨(dú)的xml布局來適配一樣善已。

實(shí)現(xiàn)原理

原理很簡單灼捂,就是在屏幕寬度到了一定范圍內(nèi),然后動態(tài)返回不同的Widget换团,那么拿到屏幕的寬度就是關(guān)鍵悉稠,其實(shí)很簡單

MediaQuery.of(context).size.width

詳細(xì)介紹參見官方文檔MediaQuery
大致意思是說,WidgetsAppMaterialApp目前只有它們引入了MediaQuery并隨著它們的變化與當(dāng)前屏幕指標(biāo)保持最新艘包,所以這也是為什么當(dāng)你沒有用這兩個widget布局的猛,最終報(bào)錯的原因,用的時(shí)候注意想虎。
我們來看個細(xì)節(jié)哈

WidgetsApp

MaterialApp

WidgetsAppMaterialApp
繼承自StatefulWidget卦尊,我們平時(shí)寫的組件也大部分都是繼承自StatefulWidget,所以這就說明舌厨,你平時(shí)自己寫的組件岂却,如果是一個單獨(dú)的新頁面,當(dāng)你用到這個MediaQuery時(shí)肯定會報(bào)錯裙椭,不信你試試哈躏哩。
我們知道寬度后就好說了,只需要加入寬度判斷就ok

  static bool isSmallScreen(BuildContext context) {
    return MediaQuery.of(context).size.width < 768;
  }

  static bool isLargeScreen(BuildContext context) {
    return MediaQuery.of(context).size.width > 768;
  }

  static bool isMediumScreen(BuildContext context) {
    return MediaQuery.of(context).size.width > 425 &&
        MediaQuery.of(context).size.width < 1200;
  }

然后在Widget build(BuildContext context)的時(shí)候返回不同的布局

 return LayoutBuilder(
      builder: (context, constraints) {
        if (constraints.maxWidth > 768) {
          return largeScreen;
        } else if (constraints.maxWidth < 1200 && constraints.maxWidth > 425) {
          return mediumScreen ?? largeScreen;
        } else {
          return smallScreen ?? largeScreen;
        }
      },
    );

如何使用呢

  ConstrainedBox(
        constraints: BoxConstraints(
            minWidth: constraints.maxWidth, minHeight: constraints.maxHeight),
        child: ResponsiveWidget(
          largeScreen: _buildLargeScreen(context),
          mediumScreen: _buildMediumScreen(context),
          smallScreen: _buildSmallScreen(context),
        ),
      )

ConstrainedBox用于對子組件添加額外的約束揉燃,這里就是為了限制布局的寬高都充滿屏幕扫尺,準(zhǔn)確的說是充滿父容器,保證計(jì)算的寬度不會出現(xiàn)失誤炊汤。

官方動態(tài)適配方案

官方解讀:
responsive響應(yīng)式應(yīng)用程序會根據(jù)屏幕或窗口的大小和形狀來布局其UI正驻。當(dāng)同一個應(yīng)用程序可以在各種設(shè)備(從手表,手機(jī)抢腐,平板電腦到筆記本電腦或臺式機(jī))上運(yùn)行時(shí)姑曙,這尤其必要。當(dāng)用戶在筆記本電腦或臺式機(jī)上調(diào)整窗口大小或更改手機(jī)或平板電腦的方向時(shí)氓栈,應(yīng)用程序應(yīng)通過相應(yīng)地重新排列UI來做出響應(yīng)渣磷。
官方推薦博客:

國外開源方案

image.png

responsive_builder這個框架的原理跟我介紹的一樣,封裝的會詳細(xì)一些提完。請參考形纺。

我介紹的方案地址

responsive_widget.dart

在線看效果

ibaozi.cn

結(jié)束

以后碰到Flutter中實(shí)用的東東,在分享給你們哈徒欣。歡迎留言討論逐样。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子脂新,更是在濱河造成了極大的恐慌挪捕,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件争便,死亡現(xiàn)場離奇詭異级零,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)滞乙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門奏纪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斩启,你說我怎么就攤上這事序调。” “怎么了兔簇?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵发绢,是天一觀的道長。 經(jīng)常有香客問我男韧,道長朴摊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任此虑,我火速辦了婚禮,結(jié)果婚禮上口锭,老公的妹妹穿的比我還像新娘朦前。我一直安慰自己,他們只是感情好鹃操,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布韭寸。 她就那樣靜靜地躺著,像睡著了一般荆隘。 火紅的嫁衣襯著肌膚如雪恩伺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天椰拒,我揣著相機(jī)與錄音晶渠,去河邊找鬼。 笑死燃观,一個胖子當(dāng)著我的面吹牛褒脯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缆毁,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼番川,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起颁督,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤践啄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后沉御,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屿讽,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年嚷节,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了聂儒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡硫痰,死狀恐怖衩婚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情效斑,我是刑警寧澤非春,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站缓屠,受9級特大地震影響奇昙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜敌完,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一储耐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滨溉,春花似錦什湘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脯颜,卻和暖如春哟旗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背栋操。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工闸餐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人讼庇。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓绎巨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蠕啄。 傳聞我的和親對象是個殘疾皇子场勤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

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

  • 國慶后面兩天在家學(xué)習(xí)整理了一波flutter戈锻,基本把能擼過能看到的代碼都過了一遍,此文篇幅較長和媳,建議保存(star...
    Nealyang閱讀 4,345評論 1 17
  • Flutter是開源并且免費(fèi)的格遭,擁有現(xiàn)代的響應(yīng)式框架特性,高速的2D渲染引擎留瞳,方便快捷的開發(fā)工具以及各種開箱即用的...
    luehning閱讀 567評論 0 0
  • 1拒迅、 Widget 基本概念 1、flutter中一切皆是Widget她倘,不只是構(gòu)建頁面的UI璧微,還有如布局類、事件處...
    風(fēng)之化身呀閱讀 1,473評論 0 0
  • 時(shí)光都一天天過去硬梁,新的明天又將迎來前硫,就這樣迎了小喬。 ...
    皇帝的簡稱閱讀 370評論 1 0
  • 這個操作符可以用來快速的對 nil 進(jìn)行判斷,當(dāng)左側(cè)的值是 非 nil時(shí)返回其value左側(cè)的值荧止,為nil時(shí)返回其...
    GavinKang閱讀 1,845評論 1 0