問題:flutter中我們自定義組件,然后添加在頁面中,當我們在頁面中使用setState方法,刷新頁面內容時,會發現有時候我們的自定義組件有時候並不會實時刷新
flutter中有一套他自己的緩存機制,只會在他覺得頁面需要刷新的時候才會重新繪制我們的自定義組件 針對以上問題,這里提供兩種解決方案
1.使用Key(推薦,實測有效)
StatefulWidget組件的刷新機制 當頁面需要刷新時會調用widget組件的canUpdate,比較新老widget的key和runtype是否相同,如果不同則重新繪制,如果相同,則使用老的widget,頁面也就不會刷新了,這個時候如果我們想要讓頁面刷新,可以給我們的組件聲明一個key屬性,傳一個UniqueKey(),這樣,就相當於主動告訴widget需要刷新啦,親測使用這種方式能夠完美解決頁面不刷新的問題
AdditionView(
key: UniqueKey(),
value: model.count ?? 0,
onTap: (type, res) {
model.count = num.parse(res).toInt();
Provider.of<ActivityCartProvider>(context,
listen: false)
.add(model, _detail);
},
)
2.把組件定義成變量,在需要使用地方reload一下(有些場合有用,某些場合會出現setSate報錯的情況 提示當前組件已經被dispose)
- 在父視圖中創建一個自定義的widget變量,然后在需要使用地方加載當前組件
SearchContent _searchContent = SearchContent();
_searchContent.resetKey();
- 在組件中保存state變量 並初始化一個reload方法
class SearchContent extends StatefulWidget {
final String keyword;
SearchContent({
Key key,
this.keyword,
}):super(key:key);
_SearchContentState myContentState = _SearchContentState();
@override
_SearchContentState createState() => myContentState;
void resetKey(String keyword) {
myContentState.research(keyword);
}
}
class _SearchContentState extends State<SearchContent> {
void research(String keword) {
_keyword = keword;
_searchReq(keword);
}
}
- 在StatefulWidget內容區創建一個自定義方法reloadData用來刷新頁面數據