Exception 调用setState()或markNeedsBuild()>;当小部件树被锁定时。改变状态时

Exception 调用setState()或markNeedsBuild()>;当小部件树被锁定时。改变状态时,exception,dart,flutter,state,Exception,Dart,Flutter,State,请看我的代码: class HomePageState extends State<HomePage> { bool _isLoading = false; ..... @override Widget build(BuildContext context) { var drawerOptions = <Widget>[]; ...... drawerOptions.add(new ListTile( leadi

请看我的代码:

class HomePageState extends State<HomePage> {
  bool _isLoading = false;

.....

  @override
  Widget build(BuildContext context) {

    var drawerOptions = <Widget>[];
    ......

    drawerOptions.add(new ListTile(
        leading: new Icon(Icons.account_balance),
        title: new Text(Strings.menu_change_city),
        onTap: () => createDialog()
    ));


    if(_isLoading) return buildBusyForm();

    return Scaffold( .... //window content
  }

}
类HomePageState扩展状态{
bool_isLoading=false;
.....
@凌驾
小部件构建(构建上下文){
var Droproptions=[];
......
添加(新的ListTile)(
前导:新图标(图标。账户余额),
标题:新文本(字符串、菜单、更改、城市),
onTap:()=>createDialog()
));
如果(_isLoading)返回buildBusyForm();
返回脚手架(..//窗口内容)
}
}
所以我有了导航抽屉。一个项目(“选择城市”)没有关闭导航抽屉,它显示选择城市对话框:

createDialog() {

    setState(() {_isLoading = true;});

    fetchCities().then((response) {

      setState(() {_isLoading = false;});

      showDialog(
          context: context,
          builder: (context) => CityChoiceDialog<City>(
              title: Text(Strings.menu_change_city),
              items: response,
              initialValue: response.firstWhere((c) => c.id == globals.cityId, orElse: () => new City()),
              itemBuilder: (City city) => Text(city.name),
              onSelected: _onSelected,
              onSubmitted: _onSubmitted));
    });
  }
createDialog(){
setState((){u isLoading=true;});
fetchCities()。然后((响应){
setState((){u isLoading=false;});
显示对话框(
上下文:上下文,
生成器:(上下文)=>CityChoiceDialog(
标题:文本(字符串、菜单、更改、城市),
项目:答复,
initialValue:response.firstWhere((c)=>c.id==globals.cityId,或lse:()=>new City()),
itemBuilder:(城市)=>文本(City.name),
当选:_onSelected,
未提交的:未提交的);
});
}
所以,基本上,它的目的是显示繁忙的表单,加载城市,然后隐藏繁忙的表单和显示城市列表对话框。由于它似乎起作用,我得到了一个例外:

I/颤振(10662):══╡ WIDGETS库捕获到异常 ╞═══════════════════════════════════════════════════════════ I/颤振 (10662):在完成 小部件树:I/flatter(10662):调用setState()或markNeedsBuild() 当小部件树被锁定时。I/flatter(10662):这个 _无法将ModalScope小部件标记为需要构建,因为框架为I/颤振(10662):锁定。I/颤振(10662): 调用setState()或markNeedsBuild()的小部件是: I/颤振(10662):
_ModalScope-[LabeledGlobalKey#1f222](状态: I/颤振(10662):_模态镜状态#6c40b)


如何正确执行我想要的操作?

此错误意味着您正在生成阶段调用setState,您无法执行此操作。

如何关闭抽屉?我注意到,如果我在尝试更改状态之前关闭抽屉,问题可以解决。如果抽屉仍然打开,并且我想要更改状态,我会遇到此异常。这种类型的只有在调试器中才会注意到异常,但当您在实际设备上运行此应用程序时,它不会产生任何明显的效果。我尝试过。可能与此相关: