【问题标题】:Flutter: showing a dialog at startupFlutter:在启​​动时显示一个对话框
【发布时间】:2021-04-22 03:07:44
【问题描述】:

我现在对 Flutter 已经很熟悉了,但我无法理解这一点。

我想在State<T> 类中的第一次启动时显示一个对话框,其中T 是一个有状态的小部件。该对话框包含一些有关如何使用该应用程序的简短说明。但是在build 方法中执行此逻辑会引发错误,在initState 中与在didChangeDependencies 方法中一样。

那么我可以在哪里(或者更确切地说是什么时候)调用以下逻辑

if(someCondition)
   showDialog(...);

没有出现以下错误

在构建 FutureBuilder(state: _FutureBuilderState#66844) 时抛出了以下断言: 在构建期间调用 setState() 或 markNeedsBuild()。

此 Overlay 小部件无法标记为需要构建,因为 框架已经在构建小部件的过程中。一个小部件可以 仅在以下情况之一被标记为需要在构建阶段构建 它的祖先正在建造中。这个例外是允许的,因为 框架在子级之前构建父级小部件,这意味着 肮脏的后代将永远被建造。否则,框架可能 在此构建阶段不要访问此小部件。其上的小部件 setState() 或 markNeedsBuild() 被称为: 覆盖-[LabeledGlobalKey#27d99] 状态: OverlayState#4aeab(条目:[OverlayEntry#3c67c(不透明:真; 维护状态:假),OverlayEntry#564f9(不透明:假; 维护状态:真),OverlayEntry#7b46b(不透明:假;维护状态: false), OverlayEntry#81c9d(opaque: false; maintainState: true)]) 有问题的调用时当前正在构建的小部件 制作的是:FutureBuilder 状态:_FutureBuilderState#66844

【问题讨论】:

    标签: flutter


    【解决方案1】:

    在尝试显示对话框之前确保您的小部件已完全构建

    @override
    void initState() {
      super.initState();
    
      WidgetsBinding.instance.addPostFrameCallback((_) {
        showDialog(
          // ...
        );
      });
    }
    

    【讨论】:

    • 谢谢。关于框架还有一些我不知道的事情。
    猜你喜欢
    • 1970-01-01
    • 2011-04-03
    • 2023-04-04
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多