【问题标题】:setState() or markNeedsBuild() called > when widget tree was locked. when changing statesetState() 或 markNeedsBuild() 在小部件树被锁定时调用 >。改变状态时
【发布时间】:2019-03-07 08:00:23
【问题描述】:

请看我的代码:

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
  }

}

所以我有导航抽屉。一项(“选择城市”)不关闭导航抽屉,它显示选择城市对话框:

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));
    });
  }

所以,基本上它的目的是显示繁忙的表格,加载城市,然后隐藏繁忙的表格并显示城市列表对话框。由于它似乎有效,但我遇到了异常:

I/flutter (10662): ══╡ 小部件库发现异常 ╞═════════════════════════════════════════════════ ══════════ I/颤振 (10662):在完成 小部件树:I/flutter (10662):调用 setState() 或 markNeedsBuild() 当小部件树被锁定时。我/颤振(10662):这个 _ModalScope 小部件无法标记为需要构建,因为框架是 I/flutter (10662):已锁定。我/颤振(10662): 调用 setState() 或 markNeedsBuild() 的小部件是: 我/颤振 (10662):
_ModalScope-[LabeledGlobalKey<_modalscopestate>#1f222](状态: 我/颤振(10662):_ModalScopeState#6c40b)

如何正确地做我想做的事?

【问题讨论】:

  • 你到底是怎么关抽屉的?
  • 我注意到如果我在尝试更改状态之前关闭抽屉可以解决问题。如果抽屉仍然打开并且我想更改状态,我会收到此异常。
  • 这种异常只在调试器中发现,但是当你在实际设备上运行这个应用程序时,它不会有任何明显的影响。我试过了。

标签: exception dart flutter state


【解决方案1】:

这个错误意味着你在构建阶段调用了 setState,你不能这样做。

【讨论】:

    猜你喜欢
    • 2021-09-16
    • 2018-01-06
    • 1970-01-01
    • 2021-02-03
    • 2023-02-14
    • 2022-08-22
    • 1970-01-01
    • 2020-10-19
    • 2021-11-17
    相关资源
    最近更新 更多