2021年iOS開發-大廠面試iOS真題整理(flutter篇) Dart 相關面試題 總結

Flutter 的面試其實和 Android 面試的套路差不多,也是分兩個部分:

1.Dart

2.Flutter

畢竟 Flutter 要使用 Dart 來寫,那也就必須瞭解 Dart 的一些相關知識點。


Dart 相關面試題

1. Dart 當中的 「..」表示什麼意思?

Dart 當中的 「..」意思是 「級聯操作符」,爲了方便配置而使用。

「..」和「.」不同的是 調用「..」後返回的相當於是 this,而「.」返回的則是該方法返回的值 。

2. Dart 的作用域

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

3. Dart 是不是單線程模型?是如何運行的?

Dart 是單線程模型,如何運行的看這張圖:

引用《Flutter中文網》裏的話:

Dart 在單線程中是以消息循環機制來運行的,其中包含兩個任務隊列,一個是“微任務隊列” microtask queue,另一個叫做“事件隊列” event queue

入口函數 main() 執行完後,消息循環機制便啓動了。首先會按照先進先出的順序逐個執行微任務隊列中的任務,當所有微任務隊列執行完後便開始執行事件隊列中的任務,事件任務執行完畢後再去執行微任務,如此循環往復,生生不息。


4. Dart 多任務如何並行的?

剛纔也說了,既然 Dart 不存在多線程,那如何進行多任務並行?

Dart 當中提供了一個 類似於新線程,但是不共享內存的獨立運行的 worker - isolate

那他們是如何交互的?

這裏引用 flutter入門之dart中的併發編程、異步和事件驅動詳解 中的一部分答案:

在dart中,一個Isolate對象其實就是一個isolate執行環境的引用,一般來說我們都是通過當前的isolate去控制其他的isolate完成彼此之間的交互,而當我們想要創建一個新的Isolate可以使用Isolate.spawn方法獲取返回的一個新的isolate對象,兩個isolate之間使用SendPort相互發送消息,而isolate中也存在了一個與之對應的ReceivePort接受消息用來處理,但是我們需要注意的是,ReceivePort和SendPort在每個isolate都有一對,只有同一個isolate中的ReceivePort才能接受到當前類的SendPort發送的消息並且處理。

5. 說一下 Future?

Future,字面意思「未來」,是用來處理異步的工具。

剛纔也說過:

Dart 在單線程中是以消息循環機制來運行的,其中包含兩個任務隊列,一個是“微任務隊列” microtask queue,另一個叫做“事件隊列” event queue

Future 默認情況下其實就是往「事件隊列」裏插入一個事件,當有空餘時間的時候就去執行,當執行完畢後會回調 Future.then(v) 方法。

而我們也可以通過使用 Future.microtask 方法來向 「微任務隊列」中插入一個任務,這樣就會提高他執行的效率。

因爲在 Dart 每一個 isolate 當中,執行優先級爲 :Main > MicroTask > EventQueue

6. 說一下 Stream?

Stream 和 Feature 一樣,都是用來處理異步的工具。

但是 Stream 和 Feature 不同的地方是 Stream 可以接收多個異步結果,而Feature 只有一個。

Stream 的創建可以使用 Stream.fromFuture,也可以使用 StreamController 來創建和控制。

還有一個注意點是:普通的 Stream 只可以有一個訂閱者,如果想要多訂閱的話,要使用 asBroadcastStream()

7. 說一下 mixin?

關於什麼是 mixin,引用 張風捷特烈 文章中的:

首先mixin是一個定義類的關鍵字。直譯出來是混入,混合的意思 Dart爲了支持多重繼承,引入了mixin關鍵字,它最大的特殊處在於: mixin定義的類不能有構造方法,這樣可以避免繼承多個類而產生的父類構造方法衝突

Flutter 相關面試題

1. StatefulWidget 的生命週期

initState():Widget 初始化當前 State,在當前方法中是不能獲取到 Context 的,如想獲取,可以試試 Future.delayed()didChangeDependencies():在 initState() 後調用,State對象依賴關係發生變化的時候也會調用。•deactivate():當 State 被暫時從視圖樹中移除時會調用這個方法,頁面切換時也會調用該方法,和Android裏的 onPause 差不多。•dispose():Widget 銷燬時調用。•didUpdateWidget:Widget 狀態發生變化的時候調用。

借用 CoorChice 文章 裏的一張圖:

2. Flutter 如何與 Android iOS 通信?

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

1.BasicMessageChannel:用於傳遞字符串和半結構化的信息。2.MethodChannel:用於傳遞方法調用。Flutter主動調用Native的方法,並獲取相應的返回值。3.EventChannel:用於數據流(event streams)的通信。

具體可以查看 閒魚技術:深入理解 Flutter Platform Channel[4]

3. 什麼是 Widgets、RenderObjects 和 Elements?

Widget 僅用於存儲渲染所需要的信息。•RenderObject 負責管理佈局、繪製等操作。•Element 纔是這顆巨大的控件樹上的實體。

具體可以查看 [譯] Flutter,什麼是 Widgets、RenderObjects 和 Elements?[5]

4. 說一下什麼是狀態管理,爲什麼需要它?

首先狀態其實是一個概念上的東西,區分全局狀態和局部狀態。

局部狀態比如說一個控件中輸入的信息,全局狀態比如是登陸後從後臺請求回來的 userId。

當全局狀態越來越多,多個頁面共享一個狀態時,我們就需要管理它。

常用的狀態管理有:

•ScopedModel•BLoC•Redux / FishRedux•Provider

5. 說一下 BLoC 模式?

這裏引用一部分:

BLoC是一種利用reactive programming方式構建應用的方法,這是一個由流構成的完全異步的世界。

6. 如何統一管理錯誤頁面?

我們都知道,如果在 Flutter 當中出錯的話,那就是一片紅。

可以使用 ErrorWidget.builder 來自定義一個 Widget 就 ok 了。

總結

暫時就寫到這,寫了這麼多,自己對 Flutter & Dart 的基礎認識也更深了,也歡迎各路大佬交流。

如果你正在跳槽或者正準備跳槽不妨動動小手,添加一下咱們的交流羣1012951431來獲取一份詳細的大廠面試資料爲你的跳槽多添一份保障。

文末推薦:iOS熱門文集

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章