【金九銀十面試沖刺】Android崗面試題今日分享——Flutter篇

又到了面試題分享的時(shí)間,今天分享的是Flutter方面的的面試題,總共包含以下板塊:

Dart部分
Flutter部分

話不多說,直接接上面試題?。。?!

Dart部分面試題

一、Dart 語言的特性?

  1. Productive(生產(chǎn)力高,Dart的語法清晰明了,工具簡(jiǎn)單但功能強(qiáng)大)
  2. Fast(執(zhí)行速度快,Dart提供提前優(yōu)化編譯,以在移動(dòng)設(shè)備和Web上獲得可預(yù)測(cè)的高性能和快速啟動(dòng)。)
  3. Portable(易于移植,Dart可編譯成ARM和X86代碼,這樣Dart移動(dòng)應(yīng)用程序可以在iOS、Android和其他地方運(yùn)行)
  4. Approachable(容易上手,充分吸收了高級(jí)語言特性,如果你已經(jīng)知道C++,C語言,或者Java,你可以在短短幾天內(nèi)用Dart來開發(fā))
  5. Reactive(響應(yīng)式編程)

二、.Dart的一些重要概念?

在Dart中,一切都是對(duì)象,所有的對(duì)象都是繼承自O(shè)bjectDart是強(qiáng)類型語言,但可以用var或 dynamic來聲明一個(gè)變量,Dart會(huì)自動(dòng)推斷其數(shù)據(jù)類型,dynamic類似c#沒有賦初值的變量都會(huì)有默認(rèn)值null
Dart支持頂層方法,如main方法,可以在方法內(nèi)部創(chuàng)建方法
Dart支持頂層變量,也支持類變量或?qū)ο笞兞?br> Dart沒有public protected private等關(guān)鍵字,如果某個(gè)變量以下劃線(_)開頭,代表這個(gè)變量在庫中是私有的

三、Dart 當(dāng)中的 「..」表示什么意思?

Dart 當(dāng)中的「..」意思是「級(jí)聯(lián)操作符」,為了方便配置而使用?!?.」和「.」不同的是調(diào)用「..」后返回的相當(dāng)于是 this,而「.」返回的則是該方法返回的值。

四、 Dart 的作用域

Dart 沒有「public」「private」等關(guān)鍵字,默認(rèn)就是公開的,私有變量使用下劃線開頭。

五、Dart 是不是單線程模型?是如何運(yùn)行的?

Dart 是單線程模型,Dart 在單線程中是以消息循環(huán)機(jī)制來運(yùn)行的,其中包含兩個(gè)任務(wù)隊(duì)列,一個(gè)是“微任務(wù)隊(duì)列” microtask queue,另一個(gè)叫做“事件隊(duì)列” event queue。入口函數(shù) main() 執(zhí)行完后,消息循環(huán)機(jī)制便啟動(dòng)了。首先會(huì)按照先進(jìn)先出的順序逐個(gè)執(zhí)行微任務(wù)隊(duì)列中的任務(wù),當(dāng)所有微任務(wù)隊(duì)列執(zhí)行完后便開始執(zhí)行事件隊(duì)列中的任務(wù),事件任務(wù)執(zhí)行完畢后再去執(zhí)行微任務(wù),如此循環(huán)往復(fù),生生不息。

六、 Dart 多任務(wù)如何并行的?

剛才也說了,既然 Dart 不存在多線程,那如何進(jìn)行多任務(wù)并行?
Dart 當(dāng)中提供了一個(gè) 類似于新線程,但是不共享內(nèi)存的獨(dú)立運(yùn)行的 worker - isolate。
那他們是如何交互的?
在dart中,一個(gè)Isolate對(duì)象其實(shí)就是一個(gè)isolate執(zhí)行環(huán)境的引用,一般來說我們都是通過當(dāng)前的isolate去控制其他的isolate完成彼此之間的交互,而當(dāng)我們想要?jiǎng)?chuàng)建一個(gè)新的Isolate可以使用Isolate.spawn方法獲取返回的一個(gè)新的isolate對(duì)象,兩個(gè)isolate之間使用SendPort相互發(fā)送消息,而isolate中也存在了一個(gè)與之對(duì)應(yīng)的ReceivePort接受消息用來處理,但是我們需要注意的是,ReceivePort和SendPort在每個(gè)isolate都有一對(duì),只有同一個(gè)isolate中的ReceivePort才能接受到當(dāng)前類的SendPort發(fā)送的消息并且處理。

七、Widget和element和RenderObject之間的關(guān)系

首先我詳細(xì)說下當(dāng)時(shí)的情景,面試官問我Widget和Element之間是不是一對(duì)多的關(guān)系,如果是增加一個(gè)Widget之后,這個(gè)關(guān)系又是什么。 這部分還是沒有很好地答案,現(xiàn)在只是一個(gè)猜想,如果添加了一個(gè)widget,Element樹遍歷后面所有的Element看類型是否發(fā)生改變,有的話再重建RenderObject。Element和Widget之間應(yīng)該還是一對(duì)一的關(guān)系,因?yàn)槊總€(gè)Widget的context都是獨(dú)一無二的。

Flutter部分面試題

一、Flutter 是什么?

Flutter是谷歌的移動(dòng)UI框架,可以快速在iOS和Android上構(gòu)建高質(zhì)量的原生用戶界面。 Flutter可以與現(xiàn)有的代碼一起工作。在全世界,F(xiàn)lutter正在被越來越多的開發(fā)者和組織使用,并且Flutter是完全免費(fèi)、開源的。

二、Flutter 特性有哪些?

  1. 快速開發(fā)(毫秒級(jí)熱重載)
  2. 絢麗UI(內(nèi)建漂亮的質(zhì)感設(shè)計(jì)Material Design和Cupertino Widget和豐富平滑的動(dòng)畫效果和平臺(tái)感知)
  3. 響應(yīng)式(Reactive,用強(qiáng)大而靈活的API解決2D、動(dòng)畫、手勢(shì)、效果等難題)
  4. 原生訪問功能
  5. 堪比原生性能

三、Flutter 中的生命周期

initState()表示當(dāng)前 State 將和一個(gè) BuildContext 產(chǎn)生關(guān)聯(lián),但是此時(shí)BuildContext 沒有完全裝載完成,如果你需要在該方法中獲取 BuildContext ,可以 new Future.delayed(const Duration(seconds: 0, (){//context}); 一下。

didChangeDependencies()在 initState()之后調(diào)用,當(dāng) State 對(duì)象的依賴關(guān)系發(fā)生變化時(shí),該方法被調(diào)用,初始化時(shí)也會(huì)調(diào)用。deactivate()當(dāng) State 被暫時(shí)從視圖樹中移除時(shí),會(huì)調(diào)用這個(gè)方法,同時(shí)頁面切換時(shí),也會(huì)調(diào)用。dispose() Widget 銷毀了,在調(diào)用這個(gè)方法之前,總會(huì)先調(diào)用 deactivate()。didUpdateWidge 當(dāng) widget 狀態(tài)發(fā)生變化時(shí),會(huì)調(diào)用。

通過 StreamBuilder 和 FutureBuilder 我們可以快速使用 Stream 和 Future 快速構(gòu)建我們的異步控件,F(xiàn)lutter 中 runApp 啟動(dòng)入口其實(shí)是一個(gè) WidgetsFlutterBinding ,它主要是通過BindingBase 的子類 GestureBinding 、ServicesBinding 、SchedulerBinding 、PaintingBinding 、SemanticsBinding 、 RendererBinding 、WidgetsBinding 等,通過 mixins 的組合而成的。
Flutter 中的 Dart 的線程是以事件循環(huán)和消息隊(duì)列的形式存在,包含兩個(gè)任務(wù)隊(duì)列,一個(gè)是 microtask 內(nèi)部隊(duì)列,一個(gè)是event 外部隊(duì)列,而 microtask 的優(yōu)先級(jí)又高于event。因?yàn)?microtask 的優(yōu)先級(jí)又高于 event,同時(shí)會(huì)阻塞event 隊(duì)列,所以如果microtask 太多就可能會(huì)對(duì)觸摸、繪制等外部事件造成阻塞卡頓哦。

Flutter 中存在四大線程,分別為 UI Runner、GPU Runner、IO Runner, Platform Runner (原生主線程),同時(shí)在 Flutter 中可以通過 isolate 或者compute 執(zhí)行真正的跨線程異步操作。

四、Android 啟動(dòng)頁

Android 中 Flutter 默認(rèn)啟動(dòng)時(shí)會(huì)在 FlutterActivityDelegate.java 中讀取 AndroidManifset.xml內(nèi) meta-data 標(biāo)簽,其中 io.flutter.app.android.SplashScreenUntilFirstFrame 標(biāo)志位如果為 ture ,就會(huì)啟動(dòng) Splash 畫面效果(類似IOS的啟動(dòng)頁面)。啟動(dòng)時(shí)原生代碼會(huì)讀取 android.R.attr.windowBackground 得到指定的 Drawable , 用于顯示啟動(dòng)閃屏效果,之后并且通過 flutterView.addFirstFrameListener,在onFirstFrame 中移除閃屏。

五、Flutter 和 Dart的關(guān)系是什么?

Flutter是一個(gè)使用Dart語言開發(fā)的跨平臺(tái)移動(dòng)UI框架,通過自建繪制引擎,能高性能、高保真地進(jìn)行移動(dòng)開發(fā)。
Dart囊括了多數(shù)編程語言的優(yōu)點(diǎn),它更符合Flutter構(gòu)建界面的方式。

六、Widget 和 element 和 RenderObject 之間的關(guān)系?

  • Widget是用戶界面的一部分,并且是不可變的。
  • Element是在樹中特定位置Widget的實(shí)例。
  • RenderObject是渲染樹中的一個(gè)對(duì)象,它的層次結(jié)構(gòu)是渲染庫的核心。

Widget會(huì)被inflate(填充)到Element,并由Element管理底層渲染樹。Widget并不會(huì)直接管理狀態(tài)及渲染, 而是通過State這個(gè)對(duì)象來管理狀態(tài)。Flutter創(chuàng)建Element的可見樹,相對(duì)于Widget來說,是可變的,通常界面開發(fā)中,我們不用直接操作Element,而是由框架層實(shí)現(xiàn)內(nèi)部邏輯。就如一個(gè)UI視圖樹中,可能包含有多個(gè)TextWidget(Widget被使用多次),但是放在內(nèi)部視圖樹的視角,這些TextWidget都是填充到一個(gè)個(gè)獨(dú)立的Element中。Element會(huì)持有renderObject和widget的實(shí)例。記住,Widget 只是一個(gè)配置,RenderObject 負(fù)責(zé)管理布局、繪制等操作。

在第一次創(chuàng)建 Widget 的時(shí)候,會(huì)對(duì)應(yīng)創(chuàng)建一個(gè) Element,然后將該元素插入樹中。如果之后 Widget 發(fā)生了變化,則將其與舊的 Widget 進(jìn)行比較,并且相應(yīng)地更新 Element。重要的是,Element 不會(huì)被重建,只是更新而已。

七、mixin extends implement 之間的關(guān)系?

繼承(關(guān)鍵字 extends)、混入 mixins (關(guān)鍵字 with)、接口實(shí)現(xiàn)(關(guān)鍵字 implements)。這三者可以同時(shí)存在,前后順序是extends -> mixins -> implements。
Flutter中的繼承是單繼承,子類重寫超類的方法要用@Override,子類調(diào)用超類的方法要用super。
在Flutter中,Mixins是一種在多個(gè)類層次結(jié)構(gòu)中復(fù)用類代碼的方法。mixins的對(duì)象是類,mixins絕不是繼承,也不是接口,而是一種全新的特性,可以mixins多個(gè)類,mixins的使用需要滿足一定條件

八、. 使用mixins的條件是什么?

因?yàn)閙ixins使用的條件,隨著Dart版本一直在變,這里講的是Dart2.1中使用mixins的條件:

  • mixins類只能繼承自object
  • mixins類不能有構(gòu)造函數(shù)
  • 一個(gè)類可以mixins多個(gè)mixins類
  • 可以mixins多個(gè)類,不破壞Flutter的單繼承

九、Flutter main future mirotask 的執(zhí)行順序?

普通代碼都是同步執(zhí)行的,結(jié)束后會(huì)開始檢查microtask中是否有任務(wù),若有則執(zhí)行,執(zhí)行完繼續(xù)檢查microtask,直到microtask列隊(duì)為空。最后會(huì)去執(zhí)行event隊(duì)列(future)

十、Stream 兩種訂閱模式?

Stream有兩種訂閱模式:單訂閱(single) 和 多訂閱(broadcast)。
單訂閱就是只能有一個(gè)訂閱者,而廣播是可以有多個(gè)訂閱者。這就有點(diǎn)類似于消息服務(wù)(Message Service)的處理模式。單訂閱類似于點(diǎn)對(duì)點(diǎn),在訂閱者出現(xiàn)之前會(huì)持有數(shù)據(jù),在訂閱者出現(xiàn)之后就才轉(zhuǎn)交給它。而廣播類似于發(fā)布訂閱模式,可以同時(shí)有多個(gè)訂閱者,當(dāng)有數(shù)據(jù)時(shí)就會(huì)傳遞給所有的訂閱者,而不管當(dāng)前是否已有訂閱者存在。
Stream 默認(rèn)處于單訂閱模式,所以同一個(gè) stream 上的 listen 和其它大多數(shù)方法只能調(diào)用一次,調(diào)用第二次就會(huì)報(bào)錯(cuò)。但 Stream 可以通過 transform() 方法(返回另一個(gè) Stream)進(jìn)行連續(xù)調(diào)用。通過Stream.asBroadcastStream() 可以將一個(gè)單訂閱模式的 Stream 轉(zhuǎn)換成一個(gè)多訂閱模式的 Stream,isBroadcast 屬性可以判斷當(dāng)前 Stream 所處的模式。

十一、Flutter中的Widget、State、Context 的核心概念?是為了解決什么問題?

  1. Widget: 在Flutter中,幾乎所有東西都是Widget。將一個(gè)Widget想象為一個(gè)可視化的組件(或與應(yīng)用可視化方面交互的組件),當(dāng)你需要構(gòu)建與布局直接或間接相關(guān)的任何內(nèi)容時(shí),你正在使用Widget。 Widget樹: Widget以樹結(jié)構(gòu)進(jìn)行組織。包含其他Widget的widget被稱為父Widget(或widget容器)。包含在父widget中的widget被稱為子Widget。

  2. Context: 僅僅是已創(chuàng)建的所有Widget樹結(jié)構(gòu)中的某個(gè)Widget的位置引用。簡(jiǎn)而言之,將context作為widget樹的一部分,其中context所對(duì)應(yīng)的widget被添加到此樹中。一個(gè)context只從屬于一個(gè)widget,它和widget 一樣是鏈接在一起的,并且會(huì)形成一個(gè)context樹。

  3. State: 定義了StatefulWidget實(shí)例的行為,它包含了用于”交互/干預(yù)“Widget信息的行為和布局。應(yīng)用于State的任何更改都會(huì)強(qiáng)制重建Widget。

這些狀態(tài)的引入,主要是為了解決多個(gè)部件之間的交互和部件自身狀態(tài)的維護(hù)

十二、Widget 唯一標(biāo)識(shí)Key有那幾種?

在flutter中,每個(gè)widget都是被唯一標(biāo)識(shí)的。這個(gè)唯一標(biāo)識(shí)在build或rendering階段由框架定義。該標(biāo)識(shí)對(duì)應(yīng)于可選的Key參數(shù),如果省略,F(xiàn)lutter將會(huì)自動(dòng)生成一個(gè)。
在flutter中,主要有4種類型的Key:GlobalKey(確保生成的Key在整個(gè)應(yīng)用中唯一,是很昂貴的,允許element在樹周圍移動(dòng)或變更父節(jié)點(diǎn)而不會(huì)丟失狀態(tài))、LocalKey、UniqueKey、ObjectKey。

最后

我整理了一套Android面試題合集,除了以上面試題,還包含【Java 基礎(chǔ)、集合、多線程、虛擬機(jī)、反射、泛型、并發(fā)編程、Android四大組件、異步任務(wù)和消息機(jī)制、UI繪制、性能調(diào)優(yōu)、SDN、第三方框架、設(shè)計(jì)模式、Kotlin、計(jì)算機(jī)網(wǎng)絡(luò)、系統(tǒng)啟動(dòng)流程、Dart、Flutter、算法和數(shù)據(jù)結(jié)構(gòu)、NDK、H.264、H.265.音頻編編解碼、FFmpeg、OpenMax、OpenCV、OpenGL ES

目錄2.png

有需要的朋友可以關(guān)注一下哇哇,以上都可以分享?。?!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、flutter與原生通信,三種通道的區(qū)別 1.1 MethodChannel Flutter與Native端相...
    耿宏達(dá)閱讀 1,845評(píng)論 0 4
  • 1. Dart 當(dāng)中的 「..」表示什么意思? Dart 當(dāng)中的 「..」意思是 「級(jí)聯(lián)操作符」,為了方便配置而使...
    馬修斯閱讀 13,982評(píng)論 0 22
  • 1、Dart中var 與 dynamic的區(qū)別 2、const和final的區(qū)別 3、Dart中 ?? 與 ??=...
    永不放棄_8eef閱讀 1,690評(píng)論 0 3
  • 1、Dart是值傳遞還是引用傳遞? dart是值傳遞。 2、描述Flutter的核心渲染模塊三棵樹 WidgetT...
    Qphine閱讀 48,430評(píng)論 9 63
  • Dart 相關(guān) 1、Dart 當(dāng)中的 「..」表示什么意思? 級(jí)連操作符 “..” 和 “.” 不同:調(diào)用..后返...
    af06e7def7a7閱讀 2,568評(píng)論 0 2

友情鏈接更多精彩內(nèi)容