先看FlutterSDK的原生類State中有一個變量mounted。
abstract class State<T extends StatefulWidget> with Diagnosticable {/// mounted的作用是,此State對象當前是否在樹中。/// 在創建State對象之后,在調用initState之前,框架通過將State對象與BuildContext的關聯來 "mounts" 這個State對象。State對象保持掛載狀態,直到框架調用dispose,在此之后,框架將永遠不會要求State對象再次構建。/// 除非mounted為true,否則調用setState是錯誤的。bool get mounted => _element != null;
}
因此,在State<T extends StatefulWidget>的子類對象中,我們可以在封裝了一個刷新界面的方法。特別是在網絡數據請求等異步任務的回調中調用這個方法。
class _HomePageState extends State<HomePage>void _updateUI() {if (mounted) {setState(() {});}}void _requestData() {RequestUtil.get(urlStr: 'urlStr',param: null,showLoading: false,).then((value) {// 注: 回調可能在State對象被dispose之后才執行。if (value && value.data is List) {_dataList = value.data;} else {_dataList = [];}_updateUI();});}
}