日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

flutter中state详解

發(fā)布時間:2025/3/19 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 flutter中state详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

State

在說到StatefulWidget之前,先說下State。State的作用有兩點(diǎn):

  • 在widget構(gòu)建的時候可以被同步讀取;
  • 在widget的生命周期中可能會被改變。
  • State生命周期

    State的生命周期有四種狀態(tài):

    • created:當(dāng)State對象被創(chuàng)建時候,State.initState方法會被調(diào)用;
    • initialized:當(dāng)State對象被創(chuàng)建,但還沒有準(zhǔn)備構(gòu)建時,State.didChangeDependencies在這個時候會被調(diào)用;
    • ready:State對象已經(jīng)準(zhǔn)備好了構(gòu)建,State.dispose沒有被調(diào)用的時候;
    • defunct:State.dispose被調(diào)用后,State對象不能夠被構(gòu)建。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-Txxq1QXj-1612666084611)(http://whysodiao.com/images/State LifeCycle.png)]

    完整生命周期如下:

    • 創(chuàng)建一個State對象時,會調(diào)用StatefulWidget.createState;
    • 和一個BuildContext相關(guān)聯(lián),可以認(rèn)為被加載了(mounted);
    • 調(diào)用initState;
    • 調(diào)用didChangeDependencies;
    • 經(jīng)過上述步驟,State對象被完全的初始化了,調(diào)用build;
    • 如果有需要,會調(diào)用didUpdateWidget;
    • 如果處在開發(fā)模式,熱加載會調(diào)用reassemble;
    • 如果它的子樹(subtree)包含需要被移除的State對象,會調(diào)用deactivate;
    • 調(diào)用dispose,State對象以后都不會被構(gòu)建;
    • 當(dāng)調(diào)用了dispose,State對象處于未加載(unmounted),已經(jīng)被dispose的State對象沒有辦法被重新加載(remount)。

    setState

    State中比較重要的一個方法是setState,當(dāng)修改狀態(tài)時,widget會被更新。比方說點(diǎn)擊CheckBox,會出現(xiàn)選中和非選中狀態(tài)之間的切換,就是通過修改狀態(tài)來達(dá)到的。

    查看setState源碼,在一些異常的情況下將會拋出異常:

    • 傳入的為null;
    • 處在defunct階段;
    • created階段還沒有被加載(mounted);
    • 參數(shù)返回一個Future對象。

    檢查完一系列異常后,最后調(diào)用代碼如下:

    _element.markNeedsBuild();

    markNeedsBuild內(nèi)部,則是通過標(biāo)記element為dirty,在下一幀的時候重建(rebuild)。可以看出setState并不是立即生效,它只是將widget進(jìn)行了標(biāo)記,真正的rebuild操作,則是等到下一幀的時候才會去進(jìn)行。

    StatefulWidget和StatelessWidget

    StatefulWidget和StatelessWidget如下所示

    一個StatelessWidget可以用多個不同的BuildContext構(gòu)建,而一個StatefulWidget會為每個BuildContext創(chuàng)建一個State對象。

    StatelessWidget

    對于StatelessWidget,build方法會在如下三種情況下調(diào)用,

  • widget第一次被插入到樹中;
  • widget的父節(jié)點(diǎn)更改了配置(configuration);
  • widget依賴的InheritedWidget改變了。
  • class GreenFrog extends StatelessWidget {const GreenFrog({ Key key }) : super(key: key);@overrideWidget build(BuildContext context) {return new Container(color: const Color(0xFF2DBD3A));} }

    StatefulWidget

    StatefulWidget的兩個主要類別:

  • 在initState中創(chuàng)建資源,在dispose中銷毀,但是不依賴于InheritedWidget或者調(diào)用setState方法,這類widget基本上用在一個應(yīng)用或者頁面的root;
  • 使用setState或者依賴于InheritedWidget,這種在營業(yè)生命周期中會被重建(rebuild)很多次。
  • class YellowBird extends StatefulWidget {const YellowBird({ Key key }) : super(key: key);@override_YellowBirdState createState() => new _YellowBirdState(); }class _YellowBirdState extends State<YellowBird> {@overrideWidget build(BuildContext context) {return new Container(color: const Color(0xFFFFE306));} }

    ld(BuildContext context) {
    return new Container(color: const Color(0xFFFFE306));
    }
    }

    總結(jié)

    以上是生活随笔為你收集整理的flutter中state详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。