有时候进行Flutter刷新的时候会出现以下错误,
Unhandled Exception: setState() or markNeedsBuild() called during build.
E/flutter (15679): This Overlay widget cannot be marked as needing to build because the
framework is already in the process of building widgets. A widget can be marked as
needing to be built during the build phase only if one of its ancestors is currently
building. This exception is allowed because the framework builds parent widgets before
children, which means a dirty descendant will always be built. Otherwise, the framework
might not visit this widget during this build phase.
这个错误的意思是UI在没有build完成的时候又触发了新的build。解决办法就是延迟第二个build,或者合并成一个build。在实际开发中,如果同时请求多个接口然后进行全局UI刷新的时候容易出现,针对这种情况的话,可以使用Future.then()
的方式进行链式请求或者使用await
关键字进行解决,示例代码如下:
Future<void> _loadData1() async{
dynamic data = await Http.loadData1();
setState(() {
})
}
Future<void> _loadData2() async{
dynamic data = await Http.loadData1();
setState(() {
})
}
@override
void initState() {
super.initState();
//_loadData1();
//_loadData2();
//修改为以下方式
_loadData1().then((value) => _loadData2());
}