用Flutter做APP學習心得:Flutter widget的生命週期
第一次看文章的朋友可以關注我,會不定期釋出大廠面試題、Android架構技術知識點及解析等內容,還有Android學習PDF+原始碼筆記+面試文件+進階影片分享
更多還可以看我的GitHub連結: ,看完順便點亮一下星星哦
前言
最近一直在用flutter做app,感覺就像用vue或react寫web頁面一樣,蠻好玩的。為了加深自己對Flutter的理解,記錄一下自己的學習心得。
Widget、StatefulWidget、StatelessWidget
看原始碼就知道這三者的關係了,程式碼如下:
abstract class Widget extends DiagnosticableTree { const Widget({ this.key }); final Key key; @protected Element createElement(); static bool canUpdate(Widget oldWidget, Widget newWidget) { return oldWidget.runtimeType == newWidget.runtimeType && oldWidget.key == newWidget.key; } }abstract class StatelessWidget extends Widget { const StatelessWidget({ Key key }) : super(key: key); @override StatelessElement createElement() => StatelessElement(this); @protected Widget build(BuildContext context); }abstract class StatefulWidget extends Widget { const StatefulWidget({ Key key }) : super(key: key); @override createElement() => StatefulElement(this); @protected State createState(); }
StatelessWidget沒有狀態,可以類比react中的傻瓜元件;
StatefulWidget有狀態,狀態存在State物件中;所以一般說的生命週期都是指的是State的生命週期;
abstract class State extends Diagnosticable { void initState() { } void didChangeDependencies() { } Widget build(BuildContext context); void setState(VoidCallback fn) {} void deactivate() { } void dispose() { } void reassemble() { } void didUpdateWidget(covariant T oldWidget) { } }
現象
為了驗證State的生命週期,我的操作是從Home->page1->page2->page1->Home
從Home->page1,這是初始化的過程
I/flutter ( 4980): [debug],[lifeCycle], initState I/flutter ( 4980): [debug],[lifeCycle], didChangeDependencies I/flutter ( 4980): [debug],[lifeCycle], build
從page1->page2,相當於page1被暫時移出
I/flutter ( 4980): [debug],[lifeCycle], deactivate I/flutter ( 4980): [debug],[lifeCycle], didChangeDependencies I/flutter ( 4980): [debug],[lifeCycle], build
從page2->page1,相當於page1又被移回來了
I/flutter ( 4980): [debug],[lifeCycle], deactivate I/flutter ( 4980): [debug],[lifeCycle], didChangeDependencies I/flutter ( 4980): [debug],[lifeCycle], build
從page1->Home,相當於page1被刪除
I/flutter ( 4980): [debug],[lifeCycle], deactivate I/flutter ( 4980): [debug],[lifeCycle], dispose
生命週期的總結
直接看圖,應該很清晰了,
上述的生命週期,有兩個地方需要重點理解:
1. state物件的依賴發生變化時,這是當state中透過InheritedWidget使用了父級widget的共享資料,當資料變化的時候,就會呼叫子widget的didChangeDependencies()
2. widget重新構建時,會呼叫state的didUpdateWidget();首先要知道,每個StatefulWidget都有一個state對應; 當widget重新構建的時候,會先呼叫widget的canUpdate方法來判斷是否需要更新;如果 key與runtimeType都一樣的,會返回true,表示可以對widget進行更新,從而呼叫state的didUpdateWidget();如果 key或runtimeType不一樣的時候,那就沒必要更新,直接刪除舊的,建立個新的就可以了。
疑問
在嘗試的時候,有個現象,當widget頁面在可見到不可見之間切換的時候,呼叫的方法都是一樣的,都是deativate->didChangeDependencies->build;這裡有個疑問,既然都已經不可見了為啥還要build?或者說都build了為啥還能不可見?
這個疑問應該需要進一步挖掘Flutter的widget、element、render樹的關係,等進一步理解了Flutter UI原理後再來分享哈
最後
現在,很多公司的專案已經上flutter,還有些公司在上flutter的路上
學習要先人一步,關注我和我的專欄
點選 Flutter從入門到進階實戰領取flutter學習影片
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952849/viewspace-2671334/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Flutter widget的生命週期Flutter
- Flutter檢視Widget生命週期Flutter
- Flutter中Widget的生命週期和渲染原理Flutter
- flutter學習日記(三)————Flutter的生命週期和路由Flutter路由
- Flutter 的生命週期Flutter
- Flutter - 生命週期Flutter
- Flutter中widget生命週期和渲染邏輯Flutter
- Flutter -- Element生命週期Flutter
- 04 - 06 Flutter開發初體驗 & Widget 生命週期Flutter
- Flutter 中的生命週期分析Flutter
- Flutter生命週期的獲取Flutter
- Flutter系列五:State的生命週期Flutter
- Flutter aspectd(五)全域性監控flutter生命週期Flutter
- Flutter路由棧和生命週期解析Flutter路由
- Flutter - 生命週期監聽和管理Flutter
- Flutter:介面重新整理和生命週期Flutter
- Flutter仿Android生命週期LifecycleStateFlutterAndroid
- Apple Watch學習之路 生命週期研究APP
- 學習vue生命週期Vue
- App的生命週期APP
- Flutter核心技術與實戰 11 | 生命週期Flutter
- 【UniApp】-uni-app-OptionAPI應用生命週期和頁面生命週期APPAPI
- Flutter學習筆記(9)--元件WidgetFlutter筆記元件
- 【UniApp】-uni-app-CompositionAPI應用生命週期和頁面生命週期APPAPI
- 深入學習Activity生命週期
- vue生命週期整理學習Vue
- iOS APP的生命週期iOSAPP
- iOS App生命週期iOSAPP
- Flutter 學習 - Widget 之 Image和IconFlutter
- Flutter深入學習:Widget/Element/RenderObject詳解FlutterObject
- Angular學習(二):元件-生命週期Angular元件
- React生命週期學習筆記React筆記
- Flutter 學習筆記① 第一個 Flutter AppFlutter筆記APP
- 1、Flutter Widget(IOS Style) - CupertinoApp;FlutteriOSAPP
- iOS初級開發學習筆記:APP生命週期的學習總結iOS筆記APP
- uni-app 生命週期APP
- Flutter(八)之Flutter的基礎WidgetFlutter
- Flutter(十)之Flutter的滾動WidgetFlutter