天天看點

Flutter中的一些知識概念總結Widget、Element、RenderObjectFlutter EngineDart VMIsolateWidget的更新機制

在學習Flutter一段時間後,有一些概念性的東西,還是打算寫下來,記錄一下。

Widget、Element、RenderObject

大家都知道Widget、Element、RenderObject,每個部分負責相應的功能,我們隻需要寫Widget就行,為什麼還需要Element和RenderObject呢,這是因為Flutter為了在大量Widget時保證良好的性能,不能一直删除建立新的對象,可以複用原來的對象,比如複用Element,然後隻需要修改RenderObject的内容,這樣就能夠降低性能損耗,提高流暢性。

Flutter中的一些知識概念總結Widget、Element、RenderObjectFlutter EngineDart VMIsolateWidget的更新機制

Flutter Engine

在新版本的Flutter API中,我們可以使用源碼依賴的方式和原生混合開發,裡面提到了可以預熱一個Flutter Engine,然後Cache儲存起來,後續都使用這個Flutter Engine來處理Flutter頁面,這樣可以避免建立多個Flutter Engine,降低記憶體消耗。

那麼Flutter Engine是什麼呢?

Flutter Engine由C++實作,負責以下功能:

  • 線程管理
  • Dart VM狀态管理
  • Dart代碼加載,加載的代碼跑在各自獨立的Isolate中

Dart VM

運作Dart代碼的地方

Isolate

類似于Java中的線程,但是Isolate沒有共享記憶體,互相之間通過Port來收發資料,是以也就不存在鎖的問題。

Widget的更新機制

當有父Widget的配置資料改變時,同時其State.build傳回的Widget結構與之前不同,此時就需要重新建構對應的Element樹。為了進行Element複用,在Element重新建構前會先嘗試是否可以複用舊樹上相同位置的element,element節點在更新前都會調用其對應Widget的canUpdate方法,如果傳回true,則複用舊Element,舊的Element會使用新Widget配置資料更新,反之則會建立一個新的Element。Widget.canUpdate主要是判斷newWidget與oldWidget的runtimeType和key是否同時相等,如果同時相等就傳回true,否則就會傳回false。根據這個原理,當我們需要強制更新一個Widget時,可以通過指定不同的Key來避免複用。