flutter StatefulWidget組件不刷新


問題: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用來刷新頁面數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM