1. 設為首頁   文化中國網歡迎您~!

          用Flutter做APP學習心得:Flutter widget的生命周期

          第一次看文章的朋友可以關注我和我的專欄,會不定期發布大廠面試題、Android架構技術知識點及解析等內容,還有Android學習PDF+源碼筆記+面試文檔+進階視頻分享。



          前言

          最近一直在用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], initStateI/flutter ( 4980): [debug],[lifeCycle], didChangeDependenciesI/flutter ( 4980): [debug],[lifeCycle], build復制代碼

          從page1->page2,相當于page1被暫時移出

          I/flutter ( 4980): [debug],[lifeCycle], deactivateI/flutter ( 4980): [debug],[lifeCycle], didChangeDependenciesI/flutter ( 4980): [debug],[lifeCycle], build復制代碼

          從page2->page1,相當于page1又被移回來了

          I/flutter ( 4980): [debug],[lifeCycle], deactivateI/flutter ( 4980): [debug],[lifeCycle], didChangeDependenciesI/flutter ( 4980): [debug],[lifeCycle], build復制代碼

          從page1->Home,相當于page1被刪除

          I/flutter ( 4980): [debug],[lifeCycle], deactivateI/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學習視頻



          推薦閱讀:蘋果7p和蘋果8
          好运来 www.ajcdjs.com:靖江市| www.nnxrlt.com:白沙| www.advsignco.com:蒙阴县| www.486268.com:建瓯市| www.duhocnamhai.com:咸宁市| www.cp6167.com:辉南县| www.basicherbals.com:平定县| www.wangshangyouxi.com:都兰县| www.curvy-lady.com:乐安县| www.zzjiuda.com:申扎县| www.schmitzfinefood.com:富顺县| www.bjzhaoming.com:永和县| www.celiacosviajeros.com:长武县| www.andcamera.com:射阳县| www.4-card-poker-online.com:镇安县| www.cbyco.com:镇原县| www.sclxss.com:合水县| www.sengnie.com:简阳市| www.yusxaf.com:台北市| www.pentucketpride5k.com:灵寿县| www.xishimeiecuador.com:南和县| www.johncusick.com:金湖县| www.fnjsn.cn:乌兰县| www.kbcnewshub.com:乡城县| www.aganinsuranceagency.com:泾阳县| www.yiqitt.com:洪江市| www.archdown.com:石城县| www.hirdavatciyiz.com:天水市| www.cskxd.com:溧水县| www.gf996.com:凯里市| www.homouie8.com:禹州市| www.limonychelo.com:黔东| www.asenim.org:佛教| www.reelgeeksguide.com:靖安县| www.f7565.com:新野县| www.zgkzjz.com:盐边县| www.cdtnjx.com:榆中县| www.4455ep.com:高雄县| www.hiitblog.com:定边县| www.sharansoft.com:赤水市| www.fenggongsi.com:洪江市| www.cencorjeans.com:沂源县| www.medicalhealthblog.com:汝阳县| www.urethritis.org:武义县| www.relacjelive.net:当阳市| www.stranded-deep.net:景德镇市| www.headsion.cn:车险| www.maestroluggage.com:拜城县| www.lidadz.com:榆中县| www.dywanliqizhong.com:淮滨县| www.ph337.com:福海县| www.ou-guo.com:宜城市| www.martingayford.com:多伦县| www.troop100bsa.com:新津县| www.amysplaceforyouth.org:扎兰屯市| www.beverlysteelasia.com:民县| www.ifixart.com:上高县| www.chenxuan88.com:弋阳县| www.82588k.com:长沙市| www.xhttw.com:利川市| www.everyounggroup.com:怀集县| www.hobigoods.com:内乡县| www.ledastar.com:牡丹江市| www.pj88891.com:三门县| www.kerala-honeymoon-packages.com:文登市| www.brainknittings.com:南召县| www.stonedz.com:沁阳市| www.vosmisi.com:邮箱| www.foodtechnologys.com:资讯| www.whatschimp.com:缙云县| www.christoph-behrmann.com:扎兰屯市| www.gdgypvc.com:阳山县| www.coimbratrail.com:寻甸| www.gjcuk.com:宜兰市| www.uncanventional.com:莒南县| www.bigbanganimation.com:酒泉市| www.99jsdc.com:嘉黎县| www.xirunjiaoyu.com:密山市| www.liangji88.com:兴安县| www.rcsellshomes.com:皋兰县| www.zhuoxun0769.com:承德市| www.geoeconomic.com:喀喇沁旗| www.cp6335.com:丰原市| www.cardriverentacar.com:八宿县|