1. Dart中var與dynamic的區(qū)別:
使用var來聲明變量吱涉,dart會(huì)在編譯階段自動(dòng)推導(dǎo)出類型蝌蹂。而dynamic不在編譯期間做類型檢查而是在運(yùn)行期間做類型校驗(yàn)铛漓。
2. const和final的區(qū)別:
const 的值在編譯期確定,final 的值在運(yùn)?時(shí)確定草雕。
3. Dart中??與??=的區(qū)別:
兩者都是dart中的操作符贰锁,??表示如果為空則返回赃梧,??=表示如果為空則賦值。例如:
String a;
String b = a ?? "1";
print(b);//打印結(jié)果:1
print(a);//打印結(jié)果:null
a ??= "2";
print(a);//打印結(jié)果:2
4. Flutter中的GlobalKey是什么豌熄,有什么作用授嘀?
Globalkey可以主動(dòng)獲取以及主動(dòng)改變子控件的狀態(tài)。
5. Widget房轿、Element粤攒、RenderObject三者之間的關(guān)系:
Widget不是真正渲染UI的對象所森,它只是Element的一個(gè)配置描述,去告知Element應(yīng)該如何去渲染夯接,Widget 和 Element 之間是 ?對多的關(guān)系 焕济。RenderObject才是實(shí)際渲染的對象,Element 持有 RenderObject 和 Widget盔几。?致總結(jié)三者的關(guān)系是:配置?件 Widget ?成了 Element晴弃,?后創(chuàng)建 RenderObject 關(guān)聯(lián)到 Element 的內(nèi)部 renderObject 對象上,最后Flutter 通過 RenderObject 數(shù)據(jù)來布局和繪制逊拍。
6. 通過BoxDecoration和ClipRRect設(shè)置圓角有什么區(qū)別上鞠?
使用BoxDecoration設(shè)置圓角不會(huì)影響其child控件,也就是如果child是圖片或者也有背景色的話那么圓角效果就失效了芯丧。而ClipRRect是會(huì)影響到child的芍阎,加了圓角后,也會(huì)約束到child產(chǎn)生圓角效果缨恒。
7. 闡述state的生命周期:
- initState:state創(chuàng)建初始化時(shí)調(diào)用谴咸,表示state將和一個(gè)BuildContext產(chǎn)生關(guān)聯(lián),需要注意的是此時(shí)BuildContext還沒有完全加載完成骗露,如果需要獲取BuildContext及監(jiān)聽第一次build完成可以在下面回調(diào)中獲取
widgetsBinding=WidgetsBinding.instance;
widgetsBinding.addPostFrameCallback((callback){
print("addPostFrameCallback be invoke");
});
- didChangeDependencies:在 initState() 之后調(diào)?岭佳,當(dāng) State 對象的依賴關(guān)系發(fā)?變化時(shí),該?法被調(diào)?萧锉,初始化時(shí)也會(huì)調(diào)?珊随。
- deactivate:當(dāng)state暫時(shí)在視圖樹種移除時(shí)被調(diào)用,頁面切換時(shí)也會(huì)調(diào)用柿隙。
- dispose:state銷毀時(shí)調(diào)用叶洞,在調(diào)用此方法之前會(huì)先調(diào)用deactivate()。
-
didUpdateWidget:當(dāng)widget狀態(tài)發(fā)生變化時(shí)調(diào)用禀崖。
8. Flutter與原生通信的Channel有哪幾種京办?
Flutter定義了三種不同類型的Channel,它們分別是:
BasicMessageChannel:用于傳遞字符串和半結(jié)構(gòu)化的信息帆焕。
MethodChannel:用于傳遞方法調(diào)用(method invocation)。
EventChannel: 用于數(shù)據(jù)流(event streams)的通信不恭。
9.介紹下 Flutter 的優(yōu)缺點(diǎn):
(1)優(yōu)點(diǎn)
? 熱重載(Hot Reload)叶雹,利用 Android Studio 直接一個(gè) ctrl+s 就可以保存
并重載,模擬器立馬就可以看見效果换吧,相比原生冗長的編譯過程強(qiáng)很多折晦;
? 一切皆為 Widget 的理念,對于 Flutter 來說沾瓦,手機(jī)應(yīng)用里的所有東西都是Widget满着,通過可組合的空間集合谦炒、豐富的動(dòng)畫庫以及分層課擴(kuò)展的架構(gòu)實(shí)現(xiàn)了富有感染力的靈活界面設(shè)計(jì);
? 借助可移植的 GPU 加速的渲染引擎以及高性能本地代碼運(yùn)行時(shí)以達(dá)到跨平臺設(shè)備的高質(zhì)量用戶體驗(yàn)风喇。 簡單來說就是:最終結(jié)果就是利用 Flutter 構(gòu)建應(yīng)用在運(yùn)行效率上會(huì)和原生應(yīng)用差不多宁改。
(2)缺點(diǎn)
? 不支持熱更新;
? 三方庫有限魂莫,需要自己造輪子还蹲;
? Dart 語言編寫,增加了學(xué)習(xí)難度耙考,并且學(xué)習(xí)了 Dart 之后無其他用處谜喊,相比
JS 和 Java 來說。
10.簡述 Widget 的 StatelessWidget 和StatefulWidget 兩種狀態(tài)組件類倦始。
? StatelessWidget: 一旦創(chuàng)建就不關(guān)心任何變化斗遏,在下次構(gòu)建之前都不會(huì)改變。它們除了依賴于自身的配置信息(在父節(jié)點(diǎn)構(gòu)建時(shí)提供)外不再依賴于任何其他信息鞋邑。比如典型的 Text诵次、Row、Column炫狱、Container 等藻懒,都是StatelessWidget。它的生命周期相當(dāng)簡單:初始化视译、通過 build()渲染嬉荆。
? StatefulWidget: 在生命周期內(nèi),該類 Widget 所持有的數(shù)據(jù)可能會(huì)發(fā)生變化酷含,這樣的數(shù)據(jù)被稱為 State鄙早,這些擁有動(dòng)態(tài)內(nèi)部數(shù)據(jù)的 Widget 被稱為 StatefulWidget。比如復(fù)選框椅亚、Button 等限番。State 會(huì)與 Context 相關(guān)聯(lián),并且此關(guān)聯(lián)是永久性的呀舔,State 對象將永遠(yuǎn)不會(huì)改變其 Context弥虐,即使可以在樹結(jié)構(gòu)周圍移動(dòng),也仍將與該 context 相關(guān)聯(lián)媚赖。當(dāng) state 與 context關(guān)聯(lián)時(shí)霜瘪,state 被視為已掛載。StatefulWidget 由兩部分組成惧磺,在初始化時(shí)必須要在 createState()時(shí)初始化一個(gè)與之相關(guān)的 State 對象颖对。
11.Flutter在Debug和Release下分別使用什么編譯模式,有什么區(qū)別磨隘?
Debug模式下使用JIT編譯模式缤底,即Just in time(即時(shí)編譯)顾患,Release下使用AOT模式,即Ahead of time(提前編譯)个唧。JIT模式因?yàn)樾枰呥\(yùn)行邊編譯江解,所以會(huì)占用運(yùn)行時(shí)內(nèi)存,導(dǎo)致卡頓現(xiàn)象坑鱼,但是有動(dòng)態(tài)編譯效果對于開發(fā)者來說非常方便調(diào)試膘流。AOT模式提前編譯不會(huì)占用運(yùn)行時(shí)內(nèi)存,相對來說運(yùn)行流暢鲁沥,但是會(huì)導(dǎo)致編譯時(shí)間增加呼股。
12.Flutter出現(xiàn)異常時(shí)如何友好的提示用戶?
使用ErrorWidget.builder進(jìn)行全局設(shè)置自定義界面即可画恰。
更多好文可前往掘金主頁查看掘進(jìn)主頁