先看FlutterSDK的原生类State中有一个变量mounted。
Dart
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>的子类对象中,我们可以在封装了一个刷新界面的方法。特别是在网络数据请求等异步任务的回调中调用这个方法。
Dart
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();
});
}
}