Flutter知識

1、Dart是什麼? 和Flutter是什麼關係?

Dart是Google開發的一種面向對象的計算機編程語言,和Java類似
Flutter 是 Google 開源的 UI 工具包,幫助開發者通過一套代碼庫高效構建多平臺精美應用,支持移動、Web、桌面和嵌入式平臺
Dart是flutter的程序開發語言

2. main()和runApp()函數在flutter的作用分別是什麼?有什麼關係嗎?

main函數是類似於java語言的程序運行入口函數
runApp函數是渲染根widget樹的函數
一般情況下runApp函數會在main函數裏執行

3. 什麼是widget? 在flutter裏有幾種類型的widget?分別有什麼區別?能分別說一下生命週期嗎?

Widget在flutter裏基本是一些UI組件,和
在 Flutter 中,有兩類常用的 Widget:

  • 無狀態的 StatelessWidget
  • 有狀態的 StatefulWidget
    在開發過程中,我們經常需要繼承它們兩來實現自己的 Widget。
A、無狀態的StatelessWidget

如果你的控件一旦顯示,就不需要再做任何的變更,那麼你應該使用 StatelessWidget。
實現一個自己的 StatelessWidget 很簡單。
當你看到下面這個例子🌰時,你就知道它有多簡單了。

class PageWidget extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return _buildBody(context);
  }

Widget _buildBody(BuildContext context){
  return Container(
      …
  );
}

B、有狀態的StatefulWidget

它可以改變界面的狀態,比如顯示的文字Text、選中狀態CheckBox Switch
我們之所以可以改變狀態是因爲setState,當調用setState後,就會觸發 StatefulWidget 的視圖樹重建。

setState((){
    // 更新狀態、數據
})

因此,當我們需要一個可交互的,即能根據用戶操作或數據變化而改變視圖的 Widget 時,那就得用上 StatefulWidget 了。

週期

State的生命週期和StatefulWidget不同,當StatefulWidget的狀態改變之後就會被重建,但是State不會改變,但是 StatefulWidget在View樹中移除再插入又會生成新的State.

總體介紹一下生命週期,大致可以看成三個階段:

  • 初始化 (插入渲染樹🌲)
  • 狀態改變 (在渲染樹中存在)
  • 銷燬 (從渲染樹中移除)

生命週期詳解

initState

當插入渲染樹的時候調用,這個函數在生命週期中只調用一次. 這裏可以做一些初始化的工作,比如初始化State的變量

didChangeDependencies

這個函數會緊跟在initState之後調用,並且可以調用BuildContext.inheritFromWidgetOfExactType, 那麼BuildContext.inheritFromWidgetOfExactType的使用場景是什麼呢?

 static TabController of(BuildContext context) {
    final _TabControllerScope scope = context.inheritFromWidgetOfExactType(_TabControllerScope);
    return scope?.controller;
  }

實際上就是調用BuildContext.inheritFromWidgetOfExactType,也就是說在didChangeDependencies中,可以跨組件拿到數據

didUpdateWidget

當組件的狀態改變的時候就會調用didUpdateWidget, 比如調用setState,
實際flutter框架會創建一個新的Widget綁定State,並在函數中傳遞老的Widget.
這個函數一般用於比較新、老Widget,看看哪些屬性改變了,並對State做一些調整.
需要注意的是涉及到controller的變更,需要在這個函數中移除老的controller的監聽,並創建新controller.

deactivate

在dispoes之前,會調用這個函數

dispose

一旦到這個階段,組件就會被銷燬,這個函數一般會移除監聽,清理環境

總結

階段 調用次數
構造函數 1
initState 1
didChangeDependencies >=1
didUpdateWidget >=1
deactivate >=1
dispose 1

各方解釋

  • initState: 插入渲染樹時調用只調用一次, widget創建執行的第一個方法, 可以再裏面初始化一些數據,以及綁定控制器
  • didChangeDependencies: 當State對象的依賴發生變化時被調用
  • build: 它主要用戶構建Widget字樹的,調用次數:多次,初始化之後開始繪製界面,當調用setState觸發的時候會再次被調用
  • deactivate: 當State被暫時從視圖樹中移除時,會調用這個函數.
    頁面切換時也會調用它,因爲此時State在視圖樹中的位置發送了變化,需要先暫時移除後添加
  • dispose: 當State對象從樹中被永久移除時調用; 通常在此回調中釋放資源.
  • reassemble: 此回調是爲了專門開發調試而提供的,在熱重載(hot reload)時會被調用, 此回調在Release模式下永遠不會被調用

4. Hot Restart 和 Hot Reload 有什麼區別嗎?

Hot Reload比Hot Restart快,Hot Reload會編譯我們文件裏新加的代碼併發送給dart虛擬機,dart會更新widgets來改變UI,而Hot Restart會讓dart 虛擬機重新編譯應用。另一方面也是因爲這樣, Hot Reload會保留之前的state,而Hot Restart回你重置所有的state回到初始值。

5. 在flutter裏streams是什麼?有幾種streams?有什麼場景用到它?

Stream 用來處理連續的異步操作,Stream 是一個抽象類,用於表示一序列異步數據的源。它是一種產生連續事件的方式,可以生成數據事件或者錯誤事件,以及流結束時的完成事件

Stream 分單訂閱流和廣播流。

網絡狀態的監控

6. 簡單說一下在flutter裏async和await?

await的出現會把await之前和之後的代碼分爲兩部分,await並不像字面意思所表示的程序運行到這裏就阻塞了,而是立刻結束當前函數的執行並返回一個Future,函數內剩餘代碼通過調度異步執行。

async是和await搭配使用的,await只在async函數中出現。在async 函數裏可以沒有await或者有多個await。

7. future 和steam有什麼不一樣?

Dart異步編程的兩個特性FutureStream

在 Flutter 中有兩種處理異步操作的方式 Future 和 Stream,Future 用於處理單個異步操作,Stream 用來處理連續的異步操作.

  • Stream

a、Stream 就是事件流或者管道,是一些的異步事件,它會在上一個事件完成時通知你進行下一個事件.
b、Stream無論用什麼方式創建,都會以相同的方式返回並使用: asynchronous for loop(await for). 例子🌰:

Future<int> sumStream(Stream<int> stream) async {
    var sum = 0;
    await for (var value int stream) {
        sum += value;
    }
    return sum; 
}

c、Stream 提供 asynchronous序列化的數據.
d、該序列化數據包含了用戶生成的時間和重文件中讀取的數據.
e、你可以通過await for 的listen()來處理Stream API返回的數據流.
f、Stream 提供了錯誤相應的處理方法.
g、Streams 有兩種方式:single subscription(訂閱) 和 broadcast (廣播), 下面是兩種Streams類型說明:

1、Single subscription streams (單一訂閱)

  • 最常見,最基本的streams實現方式
  • 它的數據大部分是sequence of events. 單一訂閱必須以正確的順序交付事件,並且中間不能有任何異常
  • 這是當你在讀取文件或者接受網絡請求的時候產生的stream.
  • 這樣的流不具備冪等性,再次接收可能會不同於上次的請求
  • 當你開始監聽, 數據將被提取並以塊的形式提供

2、Broadcast streams (廣播)

  • 適用於可以一次處理一個的單個消息, 例如:這種流可用於瀏覽器中的鼠標事件.
  • 可以隨時監聽開始監聽這樣的流, 並且再收聽時會觸發事件
  • 多個收聽者可以同時收聽, 也可以取消上一個訂閱後再次收聽
  • Future

8. 什麼是flutter裏的key? 有什麼用?

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

key有LocalKey 和 GlobalKey兩種。

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

9. 在什麼場景下使用profile mode?

profile model 是用來評估app性能的,profile model 和release mode是相似的,只有保留了一些需要評估app性能的debug功能。在模擬器上profile model是不可用的。

10. 怎麼做到只在debug mode運行代碼?

foundation有一個靜態的變量kReleaseMode來表示是否是release mode

11. 怎麼理解Isolate?

isolate是Dart對actor併發模式的實現。 isolate是有自己的內存和單線程控制的運行實體。isolate本身的意思是“隔離”,因爲isolate之間的內存在邏輯上是隔離的。isolate中的代碼是按順序執行的,任何Dart程序的併發都是運行多個isolate的結果。因爲Dart沒有共享內存的併發,沒有競爭的可能性所以不需要鎖,也就不用擔心死鎖的問題

12. 列舉在flutter的狀態管理方案?

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