Flutter面試

Dart語言都是值傳遞,每次調(diào)用函數(shù)都是傳遞對象的內(nèi)存地址,而不是復(fù)制對象

優(yōu)點:熱重載(Hot Reload)

缺點:不支持熱更新,三方庫有限,需要自己造輪子

Flutter的FrameWork層是用Drat編寫的框架(SDK),它實現(xiàn)了一套基礎(chǔ)庫,組件庫,比Engine上層

Flutter的Engine層是Skia 2D的繪圖引擎庫,跟GPU交互

StatelessWidget: 一旦創(chuàng)建就不關(guān)心任何變化,在下次構(gòu)建之前都不會改變;

StatefulWidget: 在生命周期內(nèi),該類Widget所持有的數(shù)據(jù)可能會發(fā)生變化,這樣的數(shù)據(jù)被稱為State;

1.生命周期:

StatefulWidget ---->? initState? ----->? didChangeDependencies? ----> build (中間會插入 didUpdateWidget)? ----> deactivate? ---->? dispose


2. 這個就是Flutter面向?qū)ο?/h4>

繼承 extends? ?混入mixins? 接口實現(xiàn) implements

優(yōu)先繼承,其次混入,最后接口實現(xiàn)

mixins不能有構(gòu)造函數(shù),其實也是單繼承;

抽象類abstract:父類可以只聲明,不實現(xiàn);由子類去實現(xiàn);

私有變量加_,其他默認(rèn)公開

3.Flutter渲染三棵樹

WidgetTree:存放渲染內(nèi)容,只是一個配置數(shù)據(jù)結(jié)構(gòu);

Element:中間層,同時持有Widget和RenderObject,會去遍歷視圖樹;

RenderObject:負(fù)責(zé)真正的界面布局和渲染,包含大小和布局等信息,實例化RenderObject很耗時;

4.Widget分類

組合類:StatefulWidget和StatelessWidget

代理類:inheritedWidget和parentDataWidget:通過context獲取共享狀態(tài)

繪制類:RenderObjectWidget:布局相關(guān)方法調(diào)用順序:layout(準(zhǔn)備布局) --->performResize(計算大小)? ---> performLayout(開始布局) ---> markNeedPaints(是否需要重繪)

5.單訂閱和多訂閱(Stream)

single和broadcast;Stream 默認(rèn)處于單訂閱模式,所以同一個 stream 上的 listen 和其它大多數(shù)方法只能調(diào)用一次,調(diào)用第二次就會報錯。但 Stream 可以通過 transform() 方法(返回另一個 Stream)進(jìn)行連續(xù)調(diào)用。通過 Stream.asBroadcastStream() 可以將一個單訂閱模式的 Stream 轉(zhuǎn)換成一個多訂閱模式的 Stream

6.Widget? ?State? ?Context

Widget:Widget就是可視化組件,里面的結(jié)構(gòu)是樹狀的,所以說是WidgetTree,父Widget和子Widget;

State:是StatefulWidget的實例化行為,可以交互和干預(yù)Widget的狀態(tài)和布局,任何變更都會觸發(fā)重建Widget;

Context:每一個Widget都會有對應(yīng)的Widget,用來描述它的位置引用,是Widget樹的一部分;

7.Isolate執(zhí)行順序和Future,Stream的區(qū)別

Main(主事件)? --->? ? MicroTask(微事件)? ?---->? EventQueue(事件循環(huán));

最后就在微事件和事件循環(huán)中反復(fù)循環(huán),并且遵循先進(jìn)先出

Isolate實際是一個隔離的Dart上下文環(huán)境(容器)。并且不同的Isolate線程之間的通信通過port來異步進(jìn)行,在內(nèi)存上是隔離開的

耗時長的并且影響應(yīng)用流暢性的就用Isolate(比如圖片處理,JSON解析),如果耗時短的就用Future;

Isolate.spawn() 和Isolate.exit()

Future表示延遲運行的對象,用來表示一個潛在的值返回或錯誤返回,這個返回值將在未來的某個時刻才可用。Future的調(diào)用者可以注冊回調(diào),一旦返回值或錯誤可用,就可以通過回調(diào)函數(shù)對其進(jìn)行處理。

Future.delayed:創(chuàng)建在延遲一定時間后運行的Future

Future.microtask:創(chuàng)建包含使用scheduleMicrotask異步調(diào)用計算的結(jié)果的Future

Future.value:創(chuàng)建一個有值返回的Future

Future.sync:返回包含立即調(diào)用計算結(jié)果的future


Stream:在Dart中,Stream 和 Future 一樣,都是用來處理異步編程的工具。它們的區(qū)別在于,Stream 可以接收多個異步結(jié)果,而Future 只有一個。多個是asBroadcastStream()。

await for 如何使用?

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

8.組件渲染怎么完成的

通過代碼來構(gòu)建視圖結(jié)構(gòu)數(shù)據(jù),然后通過Skia圖像引擎加工成GPU數(shù)據(jù),最后通過OpenGL提供給GPU渲染

9.PlatformView原理

Platform view 就是 AndroidView 和 UIKitView 的總稱,允許將native view嵌入到Widget體系中,完成Dart對native view的控制;

Platform view 是在 native 側(cè)渲染的,并且底層實際是使用texture實現(xiàn),通過_textureId來展示,所以Platform view開銷很大。因為需要從GPU切換到CPU,然后再切換到GPU,所以盡量避免使用Platform view;一般使用是webView;

Platform view大小由父節(jié)點的大小來控制,所以需要用Expanded包裹,不然就是父視圖的大小;


10.Flutter 線程管理模型

線程管理模型:Flutter Engine會創(chuàng)建一個isolate,dart代碼運行在這個主isolate上,新創(chuàng)建的isolate由flutter進(jìn)行統(tǒng)一管理。

Flutter的線程管理由一個叫Embeder的中間層組件控制,Embeder提供了四個Task,分別是UITaskRunner、IOTaskRunner、GPUTaskRunner、platformTaskRunner

UITaskRunner:負(fù)責(zé)綁定渲染相關(guān)的操作,如timer,microtask,異步io操作;

IOTaskRunner:處理圖片數(shù)據(jù),為gpu渲染做準(zhǔn)備,比如讀取磁盤壓縮圖片的格式,將解壓成gpu能處理的格式,并傳給gpu,因其比較消耗性能所以單獨開一個線程。

GPUTaskRunner:用于執(zhí)行g(shù)pu指令,負(fù)責(zé)將layer tree提供的信息轉(zhuǎn)換為平臺可執(zhí)行的gpu指令

platformTaskRunner:所有接口調(diào)用都使用該接口,長時間卡頓將會被watchdog強(qiáng)殺。


11.Flutter狀態(tài)管理

狀態(tài)管理:

view:界面層,主要是UI

Logic:邏輯層,主要處理業(yè)務(wù)邏輯

State:狀態(tài)層,主要處理頁面所需數(shù)據(jù)狀態(tài)

Action:行為層,主要處理交互事件

Reducer:這個層級,是專門用于處理數(shù)據(jù)變化的

Provider:是最為推薦的狀態(tài)管理庫,對InheritedWidget進(jìn)行了上層封裝,解決原生setState方案的props臃腫、展示與邏輯耦合問題;Provider將頁面分為業(yè)務(wù)和視圖兩層,并定義Notifier、Consumer兩個核心概念

Notifier負(fù)責(zé)實現(xiàn)業(yè)務(wù)邏輯,且在數(shù)據(jù)更新時發(fā)出通知。

Consumer負(fù)責(zé)實現(xiàn)界面邏輯,并在數(shù)據(jù)更新時更新自身,以及用戶交互時調(diào)用Notifier方法。

12.Flutter如何與原生Android,iOS進(jìn)行通信

Flutter通過PlatformChannel與原生進(jìn)行交互,總共有三種:

BasicMessageChannel:傳遞字符串和半結(jié)構(gòu)化信息;

MethodChannel:傳遞方法調(diào)用;一般就是MethodChannel.result;

EventChannel:傳遞數(shù)據(jù)流(event streams);

13.Flutter的熱重載

基于JIT編譯模式的代碼增量同步,總共分為五步:

掃描工程改動;增量編譯;推送更新;代碼合并;Widget重建;

所以并不會讓APP重新啟動,縮短時間;

14.Flutter布局

Row (行布局)

Column (列布局)

Container (容器)

ListView(類似iOS中的UITableView):GlobalKey,通過 key 去獲取到控件對象的 BuildContext(其實就是RenderObject);

15.Flutter集成聲網(wǎng)

在initState方法里初始化RtcEngine對象,通過initAgoraRtc和addAgoraEventHandlers,和joinChannel;

在回調(diào)中有加入頻道,離開頻道,用戶加入頻道,第一次個視頻幀渲染回調(diào);

聊天相關(guān)的是單獨的createClient,通過AgoraRtmClient來管理用戶聊天等相關(guān)信息


-------------------------------------------------------------------------------------------------

Dart相關(guān)

1.Dart是類型安全的語言,它會自動做類型轉(zhuǎn)換;并且會有靜態(tài)檢查和運行時檢查;

所以它的維護(hù)性高,編譯器就可以顯示類型錯誤;

2.類型

Number? String? Bool? List? Set? Map? Null

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

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

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