Flutter面試題

1偷卧、Dart中var 與 dynamic的區(qū)別

2久锥、const和final的區(qū)別

3镇饺、Dart中 ?? 與 ??= 的區(qū)別

3侠鳄、 什么是flutter里的key? 有什么用埠啃?

key是Widgets,Elements和SemanticsNodes的標識符伟恶。

key有LocalKey 和 GlobalKey兩種碴开。

LocalKey 如果要修改集合中的控件的順序或數(shù)量。GlobalKey允許 Widget 在應用中的 任何位置更改父級而不會丟失 State博秫。

4潦牛、Flutter中的GlobalKey是什么,有什么作用

GlobalKey可以獲取到對應的Widget的State對象

需求:當我們頁面內容很多時挡育,而需要改變的內容只有很少的一部分且在樹的底層的時 候巴碗,我們如何去實現(xiàn)增量更新?

通常情況下有兩種方式即寒,第一種是通過方法的回調橡淆,去實現(xiàn)數(shù)據(jù)更新,第二種是通過GlobalKey母赵,在StatelessWidget引用StatefulWidget逸爵。

4、1main()和runApp()函數(shù)在flutter的作用分別是什么凹嘲?有什么關系嗎师倔?

* main函數(shù)是類似于java語言的程序運行入口函數(shù)

* runApp函數(shù)是渲染根widget樹的函數(shù)

* 一般情況下runApp函數(shù)會在main函數(shù)里執(zhí)行

5、什么是widget? 在flutter里有幾種類型的widget周蹭?分別有什么區(qū)別趋艘?能分別說一下生命周期嗎疲恢?

widget在flutter里基本是一些UI組件

有兩種類型的widget,分別是statefulWidget 和 statelessWidget兩種

statelessWidget不會自己重新構建自己致稀,但是statefulWidget會

statelessWidget生命周期:

1. 構造函數(shù)

2. build方法

StatefulWidget生命周期:

1. widget的構造方法

2. widget的createState方法

3. state的構造方法

4. state的initState方法(重寫該方法時冈闭,必須要先調用super. initState())

5. didChangeDependencies方法,分兩種情況:

* 調用initState方法后抖单,會調用該方法

* 從其他widget中依賴一些數(shù)據(jù)發(fā)生改變時萎攒,比如用InheritedWidget,provider來監(jiān)聽數(shù)據(jù)的改變

6. state的build方法(當調用setState方法矛绘,會重新調用build進行渲染)

7. state的deactivate方法(當state被暫時從視圖移除的時候會調用耍休,頁面push走、pop回來的時候都會調用货矮。因為push羊精、pop會改變widget在視圖樹位置,需要先移除再添加囚玫。重寫該方法時喧锦,必須要先調用super.deactivate())

8. state的dispose方法。頁面被銷毀的時候調用抓督,如:pop操作燃少。通常情況下,自己的釋放邏輯放在super.dispose()之前铃在,先操作子類在操作父類阵具。

5、簡單說一下在Flutter里async和await定铜?

await的出現(xiàn)會把await之前和之后的代碼分為兩部分阳液,await并不像字面意思所表示的程序運行到這里就阻塞了,而是立刻結束當前函數(shù)的執(zhí)行并返回一個Future揣炕,函數(shù)內剩余代碼通過調度異步執(zhí)行帘皿。

async是和await搭配使用的,await只在async函數(shù)中出現(xiàn)畸陡。在async 函數(shù)里可以沒有await或者有多個await矮烹。

6、future和steam有什么不一樣罩锐?

在 Flutter 中有兩種處理異步操作的方式 Future 和 Stream奉狈,F(xiàn)uture 用于處理單個異步操作,Stream 用來處理連續(xù)的異步操作涩惑。

8仁期、flutter中Widget、Element、RenderObject跛蛋、Layer都有什么關系熬的?

首先看一下這幾個對象的含義及作用。

* Widget:僅用于存儲渲染所需要的信息赊级。

* RenderObject:負責管理布局押框、繪制等操作。

* Element:才是這顆巨大的控件樹上的實體理逊。

Widget會被inflate(填充)到Element橡伞,并由Element管理底層渲染樹。Widget并不會直接管理狀態(tài)及渲染,而是通過State這個對象來管理狀態(tài)晋被。Flutter創(chuàng)建Element的可見樹兑徘,相對于Widget來說,是可變的羡洛,通常界面開發(fā)中挂脑,我們不用直接操作Element,而是由框架層實現(xiàn)內部邏輯。就如一個UI視圖樹中欲侮,可能包含有多個TextWidget(Widget被使用多次)崭闲,但是放在內部視圖樹的視角,這些TextWidget都是填充到一個個獨立的Element中威蕉。Element會持有renderObject和widget的實例刁俭。記住,Widget 只是一個配置忘伞,RenderObject 負責管理布局薄翅、繪制等操作沙兰。

在第一次創(chuàng)建 Widget 的時候氓奈,會對應創(chuàng)建一個 Element, 然后將該元素插入樹中鼎天。如果之后 Widget 發(fā)生了變化舀奶,則將其與舊的 Widget 進行比較,并且相應地更新 Element斋射。重要的是育勺,Element 不會被重建,只是更新而已罗岖。

9涧至、簡述state的生命周期

10、簡述flutter中自定義View流程桑包?

11南蓬、flutter_boost的優(yōu)缺點,內部實現(xiàn)

12、flutter的渲染機制

Flutter只關心向 GPU提供視圖數(shù)據(jù)赘方,GPU的 VSync信號同步到 UI線程烧颖,UI線程使用 Dart來構建抽象的視圖結構,這份數(shù)據(jù)結構在 GPU線程進行圖層合成窄陡,視圖數(shù)據(jù)提供給 Skia引擎渲染為 GPU數(shù)據(jù)炕淮,這些數(shù)據(jù)通過 OpenGL或者 Vulkan提供給 GPU跳夭。

13涂圆、flutter和nativi的優(yōu)缺點

14、flutter支不支持 120hz

16优妙、狀態(tài)管理熟悉哪些

Flutter中的狀態(tài)和前端React中的狀態(tài)概念是一致的乘综。React框架的核心思想是組件化,應用由組件搭建而成套硼,組件最重要的概念就是狀態(tài)卡辰,狀態(tài)是一個組件的UI數(shù)據(jù)模型,是組件渲染時的數(shù)據(jù)依據(jù)邪意。

Flutter的狀態(tài)可以分為全局狀態(tài)和局部狀態(tài)兩種九妈。常用的狀態(tài)管理有ScopedModel、BLoC雾鬼、Redux / FishRedux和Provider萌朱。

17、多線程怎么處理

18策菜、flutter中大圖片上傳

19晶疼、await for 如何使用

await for是不斷獲取stream流中的數(shù)據(jù),然后執(zhí)行循環(huán)體中的操作又憨。它一般用在直到stream什么時候完成翠霍,并且必須等待傳遞完成之后才能使用废亭,不然就會一直阻塞誓篱。

20薛闪、Stream有兩種訂閱模式

Stream 用來處理連續(xù)的異步操作渊胸,Stream 是一個抽象類柑晒,用于表示一系列異步數(shù)據(jù)的源数苫。它是一種產(chǎn)生連續(xù)事件的方式他托,可以生成數(shù)據(jù)事件或者錯誤事件礼仗,以及流結束時的完成事件

Stream 分單訂閱流和廣播流祸憋。

網(wǎng)絡狀態(tài)的監(jiān)控

21会宪、flutter butild 方法中的 BuildContext 具體是什么東西

BuildContext底層原理實現(xiàn)實際上就是Element of(context)原理,其實就是通過調用BuildContext各種實現(xiàn)方法遍歷widget tree和Element tree 從而獲取到指定的對象來達到數(shù)據(jù)共享的目的

【【Flutter核心類分析】深入理解BuildContext | 航行學園】http://www.voycn.com/article/flutterhexinleifenxi-shenrulijiebuildcontext

22蚯窥、flutter 打包成web 移動端 桌面端的過程是怎么樣的

23掸鹅、dart是值傳遞還是引用傳遞

值傳遞

24喜命、dart是弱引用還是強引用

強引用

25、get set方法實現(xiàn)

26河劝、Flutter 是如何與原生Android壁榕、iOS進行通信的?

Flutter 通過 PlatformChannel 與原生進行交互赎瞎,其中 PlatformChannel 分為三種:

* BasicMessageChannel :用于傳遞字符串和半結構化的信息牌里。

* MethodChannel :用于傳遞方法調用(method invocation)。

* EventChannel : 用于數(shù)據(jù)流(event streams)的通信务甥。

同時 Platform Channel 并非是線程安全的

27牡辽、簡述Flutter 的熱重載

Flutter 的熱重載是基于 JIT 編譯模式的代碼增量同步。由于 JIT 屬于動態(tài)編譯敞临,能夠將 Dart 代碼編譯成生成中間代碼态辛,讓 Dart VM 在運行時解釋執(zhí)行,因此可以通過動態(tài)更新中間代碼實現(xiàn)增量同步挺尿。

熱重載的流程可以分為 5 步奏黑,包括:掃描工程改動、增量編譯编矾、推送更新熟史、代碼合并、Widget 重建窄俏。Flutter 在接收到代碼變更后蹂匹,并不會讓 App 重新啟動執(zhí)行,而只會觸發(fā) Widget 樹的重新繪制凹蜈,因此可以保持改動前的狀態(tài)限寞,大大縮短了從代碼修改到看到修改產(chǎn)生的變化之間所需要的時間。

另一方面仰坦,由于涉及到狀態(tài)的保存與恢復履植,涉及狀態(tài)兼容與狀態(tài)初始化的場景,熱重載是無法支持的缎岗,如改動前后 Widget 狀態(tài)無法兼容静尼、全局變量與靜態(tài)屬性的更改白粉、main 方法里的更改传泊、initState 方法里的更改、枚舉和泛型的更改等鸭巴。

可以發(fā)現(xiàn)眷细,熱重載提高了調試 UI 的效率,非常適合寫界面樣式這樣需要反復查看修改效果的場景鹃祖。但由于其狀態(tài)保存的機制所限溪椎,熱重載本身也有一些無法支持的邊界。

28、怎么理解Isolate校读?

isolate是Dart對actor并發(fā)模式的實現(xiàn)沼侣。 isolate是有自己的內存和單線程控制的運行實體。isolate本身的意思是“隔離”歉秫,因為isolate之間的內存在邏輯上是隔離的蛾洛。isolate中的代碼是按順序執(zhí)行的,任何Dart程序的并發(fā)都是運行多個isolate的結果雁芙。因為Dart沒有共享內存的并發(fā)轧膘,沒有競爭的可能性所以不需要鎖,也就不用擔心死鎖的問題

29兔甘、Dart 的作用域

Dart 沒有 「public」「private」等關鍵字谎碍,默認就是公開的,私有變量使用下劃線 _開頭洞焙。

30蟆淀、Dart 當中的 「..」表示什么意思?

Dart 當中的 「..」意思是 「級聯(lián)操作符」澡匪,為了方便配置而使用扳碍。「..」和「.」不同的是 調用「..」后返回的相當于是 this仙蛉,而「.」返回的則是該方法返回的值 笋敞。

31、Dart 是不是單線程模型荠瘪?是如何運行的夯巷?

Dart 是單線程模型,運行的的流程如下圖哀墓。

簡單來說趁餐,Dart 在單線程中是以消息循環(huán)機制來運行的,包含兩個任務隊列篮绰,一個是“微任務隊列” microtask queue后雷,另一個叫做“事件隊列” event queue。

當Flutter應用啟動后吠各,消息循環(huán)機制便啟動了臀突。首先會按照先進先出的順序逐個執(zhí)行微任務隊列中的任務,當所有微任務隊列執(zhí)行完后便開始執(zhí)行事件隊列中的任務贾漏,事件任務執(zhí)行完畢后再去執(zhí)行微任務候学,如此循環(huán)往復,生生不息纵散。

32梳码、Dart 是如何實現(xiàn)多任務并行的隐圾?

前面說過, Dart 是單線程的掰茶,不存在多線程暇藏,那如何進行多任務并行的呢?其實濒蒋,Dart的多線程和前端的多線程有很多的相似之處叨咖。Flutter的多線程主要依賴Dart的并發(fā)編程、異步和事件驅動機制啊胶。

簡單的說甸各,在Dart中,一個Isolate對象其實就是一個isolate執(zhí)行環(huán)境的引用焰坪,一般來說我們都是通過當前的isolate去控制其他的isolate完成彼此之間的交互趣倾,而當我們想要創(chuàng)建一個新的Isolate可以使用Isolate.spawn方法獲取返回的一個新的isolate對象,兩個isolate之間使用SendPort相互發(fā)送消息某饰,而isolate中也存在了一個與之對應的ReceivePort接受消息用來處理儒恋,但是我們需要注意的是,ReceivePort和SendPort在每個isolate都有一對黔漂,只有同一個isolate中的ReceivePort才能接受到當前類的SendPort發(fā)送的消息并且處理诫尽。

33、說一下Dart異步編程中的 Future關鍵字炬守?

前面說過牧嫉,Dart 在單線程中是以消息循環(huán)機制來運行的,其中包含兩個任務隊列减途,一個是“微任務隊列” microtask queue酣藻,另一個叫做“事件隊列” event queue。

在Java并發(fā)編程開發(fā)中鳍置,經(jīng)常會使用Future來處理異步或者延遲處理任務等操作辽剧。而在Dart中,執(zhí)行一個異步任務同樣也可以使用Future來處理税产。在 Dart 的每一個 Isolate 當中怕轿,執(zhí)行的優(yōu)先級為 : Main > MicroTask > EventQueue。

34辟拷、說一下 mixin機制撞羽?

mixin 是Dart 2.1 加入的特性,以前版本通常使用abstract class代替梧兼。簡單來說放吩,mixin是為了解決繼承方面的問題而引入的機制智听,Dart為了支持多重繼承羽杰,引入了mixin關鍵字渡紫,它最大的特殊處在于: mixin定義的類不能有構造方法,這樣可以避免繼承多個類而產(chǎn)生的父類構造方法沖突考赛。

mixins的對象是類惕澎,mixins絕不是繼承,也不是接口颜骤,而是一種全新的特性唧喉,可以mixins多個類,mixins的使用需要滿足一定條件忍抽。

35八孝、介紹下Flutter的FrameWork層和Engine層,以及它們的作用

Flutter的FrameWork層是用Dart編寫的框架(SDK)鸠项,它實現(xiàn)了一套基礎庫干跛,包含Material(Android風格UI)和Cupertino(iOS風格)的UI界面,下面是通用的Widgets(組件)祟绊,之后是一些動畫楼入、繪制、渲染牧抽、手勢庫等嘉熊。這個純 Dart實現(xiàn)的 SDK被封裝為了一個叫作 dart:ui的 Dart庫。我們在使用 Flutter寫 App的時候扬舒,直接導入這個庫即可使用組件等功能阐肤。

Flutter的Engine層是Skia 2D的繪圖引擎庫,其前身是一個向量繪圖軟件讲坎,Chrome和 Android均采用 Skia作為繪圖引擎泽腮。Skia提供了非常友好的 API,并且在圖形轉換衣赶、文字渲染诊赊、位圖渲染方面都提供了友好、高效的表現(xiàn)府瞄。Skia是跨平臺的碧磅,所以可以被嵌入到 Flutter的 iOS SDK中,而不用去研究 iOS閉源的 Core Graphics / Core Animation遵馆。Android自帶了 Skia鲸郊,所以 Flutter Android SDK要比 iOS SDK小很多。

36货邓、簡述Flutter的線程管理模型

默認情況下秆撮,F(xiàn)lutter Engine層會創(chuàng)建一個Isolate,并且Dart代碼默認就運行在這個主Isolate上换况。必要時可以使用spawnUri和spawn兩種方式來創(chuàng)建新的Isolate职辨,在Flutter中盗蟆,新創(chuàng)建的Isolate由Flutter進行統(tǒng)一的管理。事實上舒裤,F(xiàn)lutter Engine自己不創(chuàng)建和管理線程喳资,F(xiàn)lutter Engine線程的創(chuàng)建和管理是Embeder負責的,Embeder指的是將引擎移植到平臺的中間層代碼腾供,F(xiàn)lutter Engine層的架構示意圖如下圖所示仆邓。

在Flutter的架構中,Embeder提供四個Task Runner伴鳖,分別是Platform Task Runner节值、UI Task Runner Thread、GPU Task Runner和IO Task Runner榜聂,每個Task Runner負責不同的任務察署,F(xiàn)lutter Engine不在乎Task Runner運行在哪個線程,但是它需要線程在整個生命周期里面保持穩(wěn)定峻汉。

37贴汪、介紹下Flutter的理念架構

由上圖可知,F(xiàn)lutter框架自下而上分為Embedder休吠、Engine和Framework三層扳埂。其中,Embedder是操作系統(tǒng)適配層瘤礁,實現(xiàn)了渲染 Surface設置阳懂,線程設置,以及平臺插件等平臺相關特性的適配柜思;Engine層負責圖形繪制岩调、文字排版和提供Dart運行時,Engine層具有獨立虛擬機赡盘,正是由于它的存在号枕,F(xiàn)lutter程序才能運行在不同的平臺上,實現(xiàn)跨平臺運行陨享;Framework層則是使用Dart編寫的一套基礎視圖庫葱淳,包含了動畫、圖形繪制和手勢識別等功能抛姑,是使用頻率最高的一層赞厕。

38. Future和Isolate有什么區(qū)別?

future是異步編程定硝,調用本身立即返回皿桑,并在稍后的某個時候執(zhí)行完成時再獲得返回結果。在普通代碼中可以使用await 等待一個異步調用結束。

isolate是并發(fā)編程诲侮,Dartm有并發(fā)時的共享狀態(tài)镀虐,所有Dart代碼都在isolate中運行,包括最初的main()浆西。每個isolate都有它自己的堆內存粉私,意味著其中所有內存數(shù)據(jù)顽腾,包括全局數(shù)據(jù)近零,都僅對該isolate可見,它們之間的通信只能通過傳遞消息的機制完成抄肖,消息則通過端口(port)收發(fā)久信。isolate只是一個概念,具體取決于如何實現(xiàn)漓摩,比如在Dart VM中一個isolate可能會是一個線程裙士,在Web中可能會是一個Web Worker。

39管毙、什么是Navigator? MaterialApp做了什么腿椎?

Navigator是在Flutter中負責管理維護頁面堆棧的導航器。MaterialApp在需要的時候夭咬,會自動為我們創(chuàng)建Navigator啃炸。Navigator.of(context),會使用context來向上遍歷Element樹卓舵,找到MaterialApp提供的_NavigatorState再調用其push/pop方法完成導航操作南用。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掏湾,隨后出現(xiàn)的幾起案子裹虫,更是在濱河造成了極大的恐慌,老刑警劉巖融击,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筑公,死亡現(xiàn)場離奇詭異,居然都是意外死亡尊浪,警方通過查閱死者的電腦和手機十酣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來际长,“玉大人耸采,你說我怎么就攤上這事」び” “怎么了虾宇?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長如绸。 經(jīng)常有香客問我嘱朽,道長旭贬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任搪泳,我火速辦了婚禮稀轨,結果婚禮上,老公的妹妹穿的比我還像新娘岸军。我一直安慰自己奋刽,他們只是感情好,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布艰赞。 她就那樣靜靜地躺著佣谐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪方妖。 梳的紋絲不亂的頭發(fā)上狭魂,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天,我揣著相機與錄音党觅,去河邊找鬼雌澄。 笑死,一個胖子當著我的面吹牛杯瞻,可吹牛的內容都是我干的镐牺。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼又兵,長吁一口氣:“原來是場噩夢啊……” “哼任柜!你這毒婦竟也來了?” 一聲冷哼從身側響起沛厨,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤宙地,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后逆皮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宅粥,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年电谣,在試婚紗的時候發(fā)現(xiàn)自己被綠了秽梅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡剿牺,死狀恐怖企垦,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情晒来,我是刑警寧澤钞诡,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響荧降,放射性物質發(fā)生泄漏接箫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一朵诫、第九天 我趴在偏房一處隱蔽的房頂上張望辛友。 院中可真熱鬧,春花似錦剪返、人聲如沸废累。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽九默。三九已至震放,卻和暖如春宾毒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背殿遂。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工诈铛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人墨礁。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓幢竹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恩静。 傳聞我的和親對象是個殘疾皇子焕毫,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內容

  • 1. Dart 當中的 「..」表示什么意思? Dart 當中的 「..」意思是 「級聯(lián)操作符」驶乾,為了方便配置而使...
    馬修斯閱讀 13,736評論 0 22
  • Flutter是一個相對新的跨平臺框架邑飒,但是它的流行度正在迅速提高。雇主也意識到單一代碼庫的好處级乐,依托Flutte...
    whqfor閱讀 12,790評論 1 31
  • 1疙咸、Dart是什么? 和Flutter是什么關系? Dart是Google開發(fā)的一種面向對象的計算機編程語言,和J...
    Scott昵稱被占用閱讀 9,022評論 2 13
  • 因為近來公司需要新招flutter的小伙伴,需要我來出一套面試題并面試风科。我現(xiàn)在整理出來分享給大家撒轮。 目前我就想整理...
    一疊紙船閱讀 16,616評論 0 20
  • Flutter是Google推出的一套開源跨平臺UI框架,可以快速地在Android贼穆、iOS和Web平臺上構建高質...
    GoldMask閱讀 15,487評論 2 48