Flutter在profile和release模式下的白屏問題

Flutter github#5259是一樣的問題
二話不說肠仪,先上代碼肖抱,下面這樣可以解決問題

void main(){
  runApp(MyApp());
}

改為

import 'dart:ui';//window需要import ui庫

void main(){
  //如果size是0,則設(shè)置回調(diào)异旧,在回調(diào)中runApp
  if(window.physicalSize.isEmpty){
    window.onMetricsChanged = (){
      //在回調(diào)中意述,size仍然有可能是0
      if(!window.physicalSize.isEmpty){
        window.onMetricsChanged = null;
        runApp(MyApp());
      }
    };
  } else{
    //如果size非0,則直接runApp
    runApp(MyApp());
  }
}

分析

這段代碼里有兩個東西需要了解一下的泽艘,第一個是window.onMetricsChanged欲险,源碼的注釋是這樣寫的

/// A callback that is invoked whenever the [devicePixelRatio],
/// [physicalSize], [padding], or [viewInsets] values change, for example
/// when the device is rotated or when the application is resized (e.g. when
/// showing applications side-by-side on Android).

也就是當(dāng)devicePixelRatio、physicalSize匹涮、padding天试、viewInsets這幾個東西變化時會觸發(fā)的回調(diào),其中屏幕大小就是physicalSize

第二個是physicalSize然低,上面說了這個是屏幕大小喜每,但是它一開始是0*0,直到Flutter初始化時將它賦值為屏幕大小才能獲取到非0的值

好了雳攘,說完了上面兩個東西带兜,就來說說問題。問題的坑點在于吨灭,mian()方法并不是在Flutter給physicalSize賦值后才運行的刚照,兩者并沒有固定的先后順序,從測試來看喧兄,跟設(shè)備的性能有關(guān)

之前的錯誤解法

之前是下面這樣寫的无畔,然后在新ipad air的profile模式下以及所有機型的debug模式下都會白屏啊楚,只有比較舊的mini4不會白屏

void main(){
  window.onMetricsChanged = (){
    runApp(MyApp());
    window.onMetricsChanged = null;
  };
}

經(jīng)排查,發(fā)現(xiàn)原因是mini夠慢浑彰,在設(shè)置了onMetricsChanged回調(diào)后flutter還沒有讀取到屏幕size恭理,也就還沒出觸發(fā)onMetricsChanged。

然而在新air上郭变,則是幾率性的颜价,有時和mini一樣,有時在設(shè)置onMetricsChanged之前flutter就已經(jīng)讀取了屏幕size了诉濒,所以后面一段時間都不會觸發(fā)onMetricsChanged周伦,導(dǎo)致白屏。更奇怪的是循诉,有時設(shè)置的onMetricsChanged倍觸發(fā)后横辆,仍然是白屏,排查后發(fā)現(xiàn)air上不止一次resize茄猫,而只有最后一次非0狈蚤。

所以完整的代碼中有這一段保護(hù):

window.onMetricsChanged = (){
  //這里仍然有可能是0
  if(!window.physicalSize.isEmpty){
    window.onMetricsChanged = null;
    runApp(MyApp());
  }
};

更多

Flutter設(shè)計成這樣目的應(yīng)該是想加快應(yīng)用啟動速度,不用等size賦值划纽。這樣的話0*0的問題就要開發(fā)者自己去考慮了脆侮,按照上面的代碼,可能會導(dǎo)致應(yīng)用啟動速度稍微慢一丟丟勇劣,單可以通過一些辦法例如加一個固定大小的閃屏頁來彌補上面解法的不足

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末靖避,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子比默,更是在濱河造成了極大的恐慌幻捏,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件命咐,死亡現(xiàn)場離奇詭異篡九,居然都是意外死亡,警方通過查閱死者的電腦和手機醋奠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門榛臼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窜司,你說我怎么就攤上這事沛善。” “怎么了塞祈?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵金刁,是天一觀的道長。 經(jīng)常有香客問我,道長尤蛮,這世上最難降的妖魔是什么漠秋? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮抵屿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捅位。我一直安慰自己轧葛,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布艇搀。 她就那樣靜靜地躺著尿扯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪焰雕。 梳的紋絲不亂的頭發(fā)上衷笋,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音矩屁,去河邊找鬼辟宗。 笑死,一個胖子當(dāng)著我的面吹牛吝秕,可吹牛的內(nèi)容都是我干的泊脐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼烁峭,長吁一口氣:“原來是場噩夢啊……” “哼容客!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起约郁,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤缩挑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鬓梅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體供置,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年己肮,在試婚紗的時候發(fā)現(xiàn)自己被綠了士袄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡谎僻,死狀恐怖娄柳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情艘绍,我是刑警寧澤赤拒,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響挎挖,放射性物質(zhì)發(fā)生泄漏这敬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一蕉朵、第九天 我趴在偏房一處隱蔽的房頂上張望崔涂。 院中可真熱鬧,春花似錦始衅、人聲如沸冷蚂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝙茶。三九已至,卻和暖如春诸老,著一層夾襖步出監(jiān)牢的瞬間隆夯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工别伏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蹄衷,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓厘肮,卻偏偏與公主長得像宦芦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子轴脐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

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