Flutter改變狀態(tài)變量是否必須寫在setState回調(diào)詳解
正文
我們都知道 setState(VoidCallback fn) 是這樣用的:
setState(() { count++; });
執(zhí)行完后組件會(huì)重新 build(),就可以取到 count 的最新值了。但其實(shí)這樣寫也是一樣的:
count++; setState(() {});
因?yàn)?setState() 最后會(huì)調(diào)用 markNeedsBuild()
,F(xiàn)lutter 會(huì)調(diào)度使組件 rebuild,所以狀態(tài)變量的改變不是必須寫在 setState() 的回調(diào)里面,只需要最后執(zhí)行一下 setState() 也可以達(dá)到刷新界面的效果。
那為什么 Flutter 要設(shè)計(jì) setState() 有個(gè)回調(diào)函數(shù)呢?有兩個(gè)原因:
一是 setState() 的狀態(tài)更新是同步的,如果你在 fn 里返回了一個(gè) Future
去改變狀態(tài)的值,setState 內(nèi)部的斷言會(huì)提示你不要這樣做,應(yīng)該在 Future 完成后在同步代碼里去調(diào)用 setState 改變狀態(tài)。
二是為了代碼可維護(hù)性考慮。試想一下隨著業(yè)務(wù)代碼的迭代,可能會(huì)有很多狀態(tài)變量會(huì)發(fā)生改變,比如一開始只有狀態(tài)變量 a,后來加入了狀態(tài)變量 b 和 c,代碼變成這樣:
a++; b++; c++; setState(() {});
當(dāng)后續(xù)業(yè)務(wù)發(fā)生變化這些狀態(tài)變量都不需要了,后面維護(hù)的童鞋把這些狀態(tài)變量都刪除了。因?yàn)榇蠹彝ǔ6贾魂P(guān)注改自己的代碼,會(huì)有可能忘記刪除最后的 setState,代碼就變成了這樣:
// a++; // b++; // c++; setState(() {});
這樣就造成了不必要的 rebuild 浪費(fèi)。所以綜上所述,特別是考慮到代碼的維護(hù)性,我們都應(yīng)該把狀態(tài)變量的改變放到 setState 的回調(diào)里面。
以上就是Flutter改變狀態(tài)變量是否必須寫在setState回調(diào)詳解的詳細(xì)內(nèi)容,更多關(guān)于Flutter改變狀態(tài)變量setState回調(diào)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
A07_TimePicker & DatePicker & AnalogClock & Digi
本文將帶領(lǐng)大家一起學(xué)習(xí)時(shí)間日期和時(shí)鐘的設(shè)置。A07_TimePicker & DatePicker & AnalogClock & DigitalClock 的設(shè)置,感興趣的朋友可以參考下哈2013-06-06Android Studio導(dǎo)入Project與Module的方法及實(shí)例
這篇文章主要介紹了Android Studio導(dǎo)入Project與Module的方法及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-04-04Android 應(yīng)用的全屏和非全屏實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 應(yīng)用的全屏和非全屏實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05Android Studio自動(dòng)生成UML關(guān)系圖的方法步驟
本文主要介紹了Android Studio自動(dòng)生成UML關(guān)系圖,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08Android中在WebView里實(shí)現(xiàn)Javascript調(diào)用Java類的方法
這篇文章主要介紹了Android中在WebView里實(shí)現(xiàn)Javascript調(diào)用Java類的方法,本文直接給出示例,需要的朋友可以參考下2015-03-03Android UI實(shí)現(xiàn)廣告Banner輪播效果
這篇文章主要為大家詳細(xì)介紹了Android UI實(shí)現(xiàn)廣告Banner輪播效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12