1. 程式人生 > >[Flutter] 一些面試可能會問基礎知識

[Flutter] 一些面試可能會問基礎知識

快速啟動 高質量 cti 生命周期 public react ... create tin

1. Flutter 是什麽?

Flutter是谷歌的移動UI框架,可以快速在iOS和Android上構建高質量的原生用戶界面。 Flutter可以與現有的代碼一起工作。在全世界,Flutter正在被越來越多的開發者和組織使用,並且Flutter是完全免費、開源的。

2. Flutter 特性有哪些?

快速開發(毫秒級熱重載)

  • 絢麗UI(內建漂亮的質感設計Material Design和Cupertino Widget和豐富平滑的動畫效果和平臺感知)
  • 響應式(Reactive,用強大而靈活的API解決2D、動畫、手勢、效果等難題)
  • 原生訪問功能
  • 堪比原生性能

3. Flutter 和 Dart的關系是什麽?

Flutter是一個使用Dart語言開發的跨平臺移動UI框架,通過自建繪制引擎,能高性能、高保真地進行移動開發。Dart囊括了多數編程語言的優點,它更符合Flutter構建界面的方式。

4. Dart 語言的特性?

  • Productive(生產力高,Dart的語法清晰明了,工具簡單但功能強大)
  • Fast(執行速度快,Dart提供提前優化編譯,以在移動設備和Web上獲得可預測的高性能和快速啟動。)
  • Portable(易於移植,Dart可編譯成ARM和X86代碼,這樣Dart移動應用程序可以在iOS、Android和其他地方運行)
  • Approachable(容易上手,充分吸收了高級語言特性,如果你已經知道C++,C語言,或者Java,你可以在短短幾天內用Dart來開發)
  • Reactive(響應式編程)

5. Dart的一些重要概念?

  • 在Dart中,一切都是對象,所有的對象都是繼承自Object
  • Dart是強類型語言,但可以用var或 dynamic來聲明一個變量,Dart會自動推斷其數據類型,dynamic類似c#
  • 沒有賦初值的變量都會有默認值null
  • Dart支持頂層方法,如main方法,可以在方法內部創建方法
  • Dart支持頂層變量,也支持類變量或對象變量
  • Dart沒有public protected private等關鍵字,如果某個變量以下劃線(_)開頭,代表這個變量在庫中是私有的

6. dart是值傳遞還是引用傳遞?

dart是引用傳遞的。

7. Widget 和 element 和 RenderObject 之間的關系?

  • Widget是用戶界面的一部分,並且是不可變的。
  • Element是在樹中特定位置Widget的實例。
  • RenderObject是渲染樹中的一個對象,它的層次結構是渲染庫的核心。

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

在第一次創建 Widget 的時候,會對應創建一個 Element, 然後將該元素插入樹中。如果之後 Widget 發生了變化,則將其與舊的 Widget 進行比較,並且相應地更新 Element。重要的是,Element 不會被重建,只是更新而已。

8. mixin extends implement 之間的關系?

繼承(關鍵字 extends)、混入 mixins (關鍵字 with)、接口實現(關鍵字 implements)。這三者可以同時存在,前後順序是extends -> mixins -> implements。

Flutter中的繼承是單繼承,子類重寫超類的方法要用@Override,子類調用超類的方法要用super。

在Flutter中,Mixins是一種在多個類層次結構中復用類代碼的方法。mixins的對象是類,mixins絕不是繼承,也不是接口,而是一種全新的特性,可以mixins多個類,mixins的使用需要滿足一定條件。

9. 使用mixins的條件是什麽?

因為mixins使用的條件,隨著Dart版本一直在變,這裏講的是Dart2.1中使用mixins的條件:

mixins類只能繼承自object
mixins類不能有構造函數
一個類可以mixins多個mixins類
可以mixins多個類,不破壞Flutter的單繼承

10. mixin 怎麽指定異常類型?

on關鍵字可用於指定異常類型。 on只能用於被mixins標記的類,例如mixins X on A,意思是要mixins X的話,得先接口實現或者繼承A。這裏A可以是類,也可以是接口,但是在mixins的時候用法有區別.

on 一個類:

class A {
  void a(){
    print("a");
  }
}


mixin X on A{
  void x(){
    print("x");
  }
}


class mixinsX extends A with X{
}

on 的是一個接口: 得首先實現這個接口,然後再用mix

class A {
  void a(){
    print("a");
  }
}

mixin X on A{
  void x(){
    print("x");
  }
}

class implA implements A{
  @override
  void a() {}
}

class mixinsX2 extends implA with X{
}

11. Flutter main future mirotask 的執行順序?

普通代碼都是同步執行的,結束後會開始檢查microtask中是否有任務,若有則執行,執行完繼續檢查microtask,直到microtask列隊為空。最後會去執行event隊列(future)。

12. Future和Isolate有什麽區別?

future是異步編程,調用本身立即返回,並在稍後的某個時候執行完成時再獲得返回結果。在普通代碼中可以使用await 等待一個異步調用結束。

isolate是並發編程,Dartm有並發時的共享狀態,所有Dart代碼都在isolate中運行,包括最初的main()。每個isolate都有它自己的堆內存,意味著其中所有內存數據,包括全局數據,都僅對該isolate可見,它們之間的通信只能通過傳遞消息的機制完成,消息則通過端口(port)收發。isolate只是一個概念,具體取決於如何實現,比如在Dart VM中一個isolate可能會是一個線程,在Web中可能會是一個Web Worker。

13. Stream 與 Future是什麽關系?

Stream 和 Future 是 Dart 異步處理的核心 API。Future 表示稍後獲得的一個數據,所有異步的操作的返回值都用 Future 來表示。但是 Future 只能表示一次異步獲得的數據。而 Stream 表示多次異步獲得的數據。比如界面上的按鈕可能會被用戶點擊多次,所以按鈕上的點擊事件(onClick)就是一個 Stream 。簡單地說,Future將返回一個值,而Stream將返回多次值。Dart 中統一使用 Stream 處理異步事件流。Stream 和一般的集合類似,都是一組數據,只不過一個是異步推送,一個是同步拉取。

14. Stream 兩種訂閱模式?

Stream有兩種訂閱模式:單訂閱(single) 多訂閱(broadcast)。單訂閱就是只能有一個訂閱者,而廣播是可以有多個訂閱者。這就有點類似於消息服務(Message Service)的處理模式。單訂閱類似於點對點,在訂閱者出現之前會持有數據,在訂閱者出現之後就才轉交給它。而廣播類似於發布訂閱模式,可以同時有多個訂閱者,當有數據時就會傳遞給所有的訂閱者,而不管當前是否已有訂閱者存在。
Stream 默認處於單訂閱模式,所以同一個 stream 上的 listen 和其它大多數方法只能調用一次,調用第二次就會報錯。但 Stream 可以通過 transform() 方法(返回另一個 Stream)進行連續調用。通過 Stream.asBroadcastStream() 可以將一個單訂閱模式的 Stream 轉換成一個多訂閱模式的 Stream,isBroadcast 屬性可以判斷當前 Stream 所處的模式。

15. await for 如何使用?

await for是不斷獲取stream流中的數據,然後執行循環體中的操作。它一般用在直到stream什麽時候完成,並且必須等待傳遞完成之後才能使用,不然就會一直阻塞。

Stream<String> stream = new Stream<String>.fromIterable([‘不開心‘, ‘面試‘, ‘沒‘, ‘過‘]);
main() async{
  print(‘上午被開水燙了腳‘);
  await for(String s in stream){
    print(s);
  }
  print(‘晚上還沒吃飯‘);
}

16. Flutter中的Widget、State、Context 的核心概念?是為了解決什麽問題?

Widget: 在Flutter中,幾乎所有東西都是Widget。將一個Widget想象為一個可視化的組件(或與應用可視化方面交互的組件),當你需要構建與布局直接或間接相關的任何內容時,你正在使用Widget。

Widget樹: Widget以樹結構進行組織。包含其他Widget的widget被稱為父Widget(或widget容器)。包含在父widget中的widget被稱為子Widget。

Context: 僅僅是已創建的所有Widget樹結構中的某個Widget的位置引用。簡而言之,將context作為widget樹的一部分,其中context所對應的widget被添加到此樹中。一個context只從屬於一個widget,它和widget一樣是鏈接在一起的,並且會形成一個context樹。

State: 定義了StatefulWidget實例的行為,它包含了用於”交互/幹預“Widget信息的行為和布局。應用於State的任何更改都會強制重建Widget。

這些狀態的引入,主要是為了解決多個部件之間的交互和部件自身狀態的維護。

17. Widget的兩種類型是什麽?

StatelessWidget: 一旦創建就不關心任何變化,在下次構建之前都不會改變。它們除了依賴於自身的配置信息(在父節點構建時提供)外不再依賴於任何其他信息。比如典型的Text、Row、Column、Container等,都是StatelessWidget。它的生命周期相當簡單:初始化、通過build()渲染。

StatefulWidget: 在生命周期內,該類Widget所持有的數據可能會發生變化,這樣的數據被稱為State,這些擁有動態內部數據的Widget被稱為StatefulWidget。比如復選框、Button等。State會與Context相關聯,並且此關聯是永久性的,State對象將永遠不會改變其Context,即使可以在樹結構周圍移動,也仍將與該context相關聯。當state與context關聯時,state被視為已掛載。StatefulWidget由兩部分組成,在初始化時必須要在createState()時初始化一個與之相關的State對象。

18. State 對象的初始化流程?

initState() : 一旦State對象被創建,initState方法是第一個(構造函數之後)被調用的方法。可通過重寫來執行額外的初始化,如初始化動畫、控制器等。重寫該方法時,應該首先調用super.initState()。在initState中,無法真正使用context,因為框架還沒有完全將其與state關聯。initState在該State對象的生命周期內將不會再次調用。

didChangeDependencies(): 這是第二個被調用的方法。在這一階段,context已經可用。如果你的Widget鏈接到了一個InheritedWidget並且/或者你需要初始化一些listeners(基於context),通常會重寫該方法。

build(BuildContext context): 此方法在didChangeDependencies()、didUpdateWidget()之後被調用。每次State對象更新(或當InheritedWidget有新的通知時)都會調用該方法!我們一般都在build中來編寫真正的功能代碼。為了強制重建,可以在需要的時候調用setState((){...})方法。

dispose(): 此方法在Widget被廢棄時調用。可重寫該方法來執行一些清理操作(如解除listeners),並在此之後立即調用super.dispose()。

19. Widget 唯一標識Key有那幾種?

在flutter中,每個widget都是被唯一標識的。這個唯一標識在build或rendering階段由框架定義。該標識對應於可選的Key參數,如果省略,Flutter將會自動生成一個。

在flutter中,主要有4種類型的Key:GlobalKey(確保生成的Key在整個應用中唯一,是很昂貴的,允許element在樹周圍移動或變更父節點而不會丟失狀態)、LocalKey、UniqueKey、ObjectKey。

20. 什麽是Navigator? MaterialApp做了什麽?

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

[Flutter] 一些面試可能會問基礎知識