【问题标题】:Trying to use showDialog()/show Pop up on app startup尝试在应用启动时使用 showDialog()/show Pop up
【发布时间】:2022-08-05 14:14:43
【问题描述】:

我想要达到的目标:我想在启动时打开一个弹出窗口来解释我的应用程序。

我的做法:据我通过谷歌搜索了解它,我应该使用 showDialog() 方法。最基本的形式:

showDialog(
    context: context,
    builder: (context) {
      return Text(\'data\');
    });

我尝试返回实际的对话框(例如 AlertDialog),但它不会改变行为,所以我现在只是使用带有字符串的 Text() 作为占位符。

问题:

无论我将 showDialog 函数放在哪里,它都无法按预期工作(另请参见下面的屏幕截图):

  • 将其置于 initState:我收到一条关于在 initState 完成之前调用继承的小部件的错误消息 + 关于依赖项的解释,我几乎无法理解。
  • 将它放在构建方法中:我收到一条错误消息,说明当应用程序已经在构建小部件时调用了 setState() 或 markNeedsBuild()。
  • 把它放在 DidChangeAppLifeCycleState():当我暂停应用程序然后恢复它时,这实际上正在工作并打开弹出窗口。虽然它没有在应用程序启动时打开。
  • 将其包装在 WidgetsBinding.instance!.addPostFrameCallback():我在这里提出的一个想法:How to show a popup on app start in Flutter。在 initState 和 build 中都不会改变错误消息的结果。

有任何想法吗?

截图:

从初始化状态:

从构建方法:

来自 DidChangeAppLifecycleState(“成功”变体:

    标签: flutter popup flutter-alertdialog flutter-dialog


    【解决方案1】:

    请您在您的 init 方法中尝试以下代码吗?我希望这可能会奏效。

    Future.delayed(Duration.zero, () async {
      myFunction();
    });
    

    【讨论】:

      【解决方案2】:

      在第一帧完成后,在initState 中使用WidgetsBinding.instance.addPostFrameCallback 执行其内部任务。

      addPostFrameCallback 在此帧结束时安排回调。

      下一个问题是没有材料。您可以在builder 上直接返回AlertDialog 或使用MaterialScaffold 等任何材质小部件进行包装。

        @override
        void initState() {
          super.initState();
          
          WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
            showDialog(
              context: context,
              builder: (context) {
                return const AlertDialog(
                  content: Text('data'),
                );
              },
            );
          });
        }
      

      如果您正在运行版本<3 null 安全,请使用 WidgetsBinding.instance?.addPostFrameCallback

      【讨论】:

        【解决方案3】:

        使用 WidgetsBinding.instance!.addPostFrameCallback() 的方法之一可以正常工作。 如果您通过按下按钮也显示正常的显示对话框,它将产生相同的结果。 在这里,您需要根据需要将文本(“数据”)包装在对话框小部件中,例如 alertDialog 或 simpleDialog 小部件,它将在当前脚手架中显示对话框 -

          WidgetsBinding.instance!.addPostFrameCallback((_) async {
              return await showDialog(
                  context: context,
                  builder: (context) {
                    return AlertDialog(
                      content: Text("data"),
                    );
                  });
            }); 
        

        我尝试在初始化状态下添加它,当我重新启动应用程序时弹出对话框很好

        【讨论】:

          【解决方案4】:

          非常感谢你的回答。我通过重写您的建议解决了这个问题;它有效。我认为问题在于我的 WidgetsBinding 代码中没有 _ 或其他任何内容。所以我做了:

          WidgetsBinding.instance?.addPostFrameCallback(() {})
          

          代替

          WidgetsBinding.instance?.addPostFrameCallback((_) {})
          

          【讨论】:

            猜你喜欢
            • 2019-06-25
            • 2014-01-19
            • 2016-10-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-25
            • 2014-11-02
            • 1970-01-01
            相关资源
            最近更新 更多