iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0
自我挑戰組

30天學習flutter系列 第 6

6.關於flutter的widget(三)

  • 分享至 

  • xImage
  •  

關於widget的lifecycle

什麼是widget?

首先,StatelessWidgetStatefulWidget繼承至Widget類,widget 是user interface部分的immutable description,就是描述一個UI元素的配置數據。而Flutter中真正顯示到screen上的元素是 Element 類,widget只是描述Element裡面的配置。

而兩個widget不同的點在於:

  • StatelessWidget為不需要可變狀態的widget
  • StatefulWidget具有可變狀態的widget
@immutable
abstract class Widget extends DiagnosticableTree {
  
  const Widget({ this.key });
  final Key? key;
	
  @protected
  @factory
  Element createElement();

	...
	
  static bool canUpdate(Widget oldWidget, Widget newWidget) {
    return oldWidget.runtimeType == newWidget.runtimeType
        && oldWidget.key == newWidget.key;
  }

	...
}

createElement()
該方法創建了一個Element,也就是每個Element都會對應一個widget對象

canUpdate()
判斷oldWidget和newWidget是不是同一個widget,當新舊widget的runtimeType和key相同則認為是同一個widget

使用時機:

1.當描述的用戶界面部分可以動態更改時,stateful widgets很有用,ex.由於具有內internal clock-driven state,或取決於某些system state。

2.對於僅依賴於對象本身的configuration information和widget inflated的[BuildContext] 的組合,請考慮使用 [StatelessWidget]。


StatefulWidget lifecycle

由於StatefulWidget實例本身是不可變的,所以flutter將其可變狀態存儲在( 1 )由[createState] 方法創建的單獨State對像中,
或者存儲( 2 )在State訂閱的對像中,ex.Stream or ChangeNotifier,它們的references存儲在StatefulWidget本身的final fields中

也就是Stateful Widget是把那些可變狀態透過State來存儲並透過Staet狀態改變來直接更替我們的Stateful Widget。

State是(1)可以在構建widget時同步讀取的信息,並且(2)可能在widget的生命週期內發生變化。

widget implementer有責任使用[State.setState]來確保在此類狀態更改時及時通知 [State]。

stateful widget是通過構建更具體地描述用戶界面的其他widgets的群集(a constellation of other widgets)來描述部分用戶界面的小部件。
構建過程遞歸地繼續,直到用戶界面的描述完全具體(ex.完全由描述具體 [RenderObject] 的 [RenderObjectWidget] 組成)

  1. createState

為這個widget創建可變狀態,並在tree中給定位置

flutter/lib/src/widgets/framework.dart中的StatefulWidget
https://ithelp.ithome.com.tw/upload/images/20220921/20108931uAppeTx5ut.png

  1. initState

當這個object被插入到tree中時調用
framework將為它創建的每個[State]對象調用此方法一次

重寫此方法以執行初始化,該初始化取決於此object插入樹的位置(也就是context)或用於配置此對象的小部件

flutter/lib/src/widgets/framework.dart中的State
https://ithelp.ithome.com.tw/upload/images/20220921/20108931yvmV5pc8SL.png

1-1. build

當發生調用 initStatedidChangeDependenciesdidUpdateWidget 或調用 setState更改狀態時(也就是重建widget時),都會調用此方法

flutter/lib/src/widgets/framework.dart中的State
https://ithelp.ithome.com.tw/upload/images/20220921/20108931WlhnLWVtLx.png

1-2. didChangeDependencies

此方法在initState之後以及State對象的依賴關係通過InheritedWidget更改時立即調用

flutter/lib/src/widgets/framework.dart中的State
https://ithelp.ithome.com.tw/upload/images/20220921/20108931ZWfCBFeiZZ.png

1-3. didUpdateWidget

每當widget configuration更改時,都會調用此方法。

ex.父級通過構造函數(constructor)將一些variable傳遞給子級widget

flutter/lib/src/widgets/framework.dart中的State
https://ithelp.ithome.com.tw/upload/images/20220921/20108931RRfdovN0Ea.png

1-4. deactivate

當從tree中移除object時調用此方法

flutter/lib/src/widgets/framework.dart中的State
https://ithelp.ithome.com.tw/upload/images/20220921/20108931CL3Ad61f7S.png

1-5. dispose

當object從tree中永久刪除時,將調用此方法。並且釋放該object保留的所有資源

flutter/lib/src/widgets/framework.dart中的State
https://ithelp.ithome.com.tw/upload/images/20220921/20108931MoJANkiq5a.png

StatelessWidget lifecycle

1.build

當此widget插入到給定 [BuildContext] 中的tree中並且此widget的依賴項發生更改時(例如,此小部件引用的 [InheritedWidget] 更改),framework將調用此方法。 此方法可能會在每一幀中調用,並且除了構建小部件之外不應有任何side effects

一旦構建了widget,構建方法就會自動調用


今天簡單的整理了什麼是widget以及widget是如何被創建的,我們明天見。


上一篇
5.關於flutter的widget(二)
下一篇
7.關於flutter的widget(四)
系列文
30天學習flutter30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言