避免在build方法中调用setState()或markNeedsBuild()。在build方法中,组件正在构建中,同时进行任何的状态更改都可能导致死循环或其他不确定的行为。
以下是一种可能的解决方法,将需要更改状态的逻辑从build方法中移动到其他生命周期方法中,例如didUpdateWidget()或didChangeDependencies()。或者使用Future.delayed()将状态更改推迟到下一个事件循环。
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State {
bool _isLoading = false;
void fetchData() {
setState(() {
_isLoading = true;
});
// 异步操作
someAsyncOperation().then((result) {
setState(() {
_isLoading = false;
// 把异步操作的结果处理一下
});
});
}
@override
void initState() {
super.initState();
fetchData();
}
@override
void didUpdateWidget(MyWidget oldWidget) {
if (widget.someProp != oldWidget.someProp) {
fetchData();
}
super.didUpdateWidget(oldWidget);
}
@override
Widget build(BuildContext context) {
if (_isLoading) {
return CircularProgressIndicator();
} else {
// ...
}
}
}