2

我正在 Flutter 中制作一个简单的 TODO 应用程序。在每个项目旁边我都有一个“编辑”图标,它会打开一个AlertDialog预先填写的描述和该项目的数量。当我在对话框外单击时,它按预期被关闭。description对于这种形式,我使用了两个名为and的String 变量amount,以及两个名为descriptionControllerand的控制器amountController

我还有“添加”按钮,它会打开一个类似表单的类似警报对话框,其中我使用相同的字符串变量和控制器。

在以下情况下会出现问题: - 我单击某个项目的“编辑”按钮。对话框出现,带有预填充的字段。- 我通过单击外部关闭对话框。- 我点击“新建”按钮。对话框出现,但我仍然看到之前编辑的项目中的值,而不是空字段。

其中一种解决方案当然是使用单独的控制器。但是我想知道是否有可能通过单击外部来检测对话框被关闭并执行特定操作(清除控制器)。

谢谢。

4

1 回答 1

1

这在许多情况下可能会有所帮助。而不是检测触摸/点击屏障/外部警报对话框,只需执行以下操作 -

  • 提取AlertDialog小部件并使其成为StatefulWidget.
  • A在结束/弹出时总是按顺序调用StatefulWidget。因此,您可以在这些功能中的任何一个(根据您的需要)中执行您想要在解除时执行的任何特定操作。deactivate()dispose()AlertDialog
  • AlertDialog当使用 Android 后退按钮或单击 Barrier/outside 关闭时,它将为您提供帮助。您可能需要对AlertDialog本身使用的任何按钮采取额外的预防措施,即单独检测该按钮单击,从而避免仅当 Android 后退按钮或单击 Barrier/outside 用于关闭AlertDialog.

例如,假设您正在使用TextButtonon AlertDialog

TextButton(
      child: const Text(
        'Continue',
        softWrap: true,
      ),
      onPressed: () {
        setState(() {
          isContinueButtonPressed = true;
        });
        Navigator.of(context)
            .popAndPushNamed(SomeScreen.routeName);
      },
    )

然后在deactivate()and/or里面dispose(),做这样的事情-

@override
void deactivate() {
 if (!isContinueButtonPressed){
   // do your actions if 'continue' button on AlertDialog is not pressed
 } 
 super.deactivate();
}

@override
void dispose() {
 if (!isContinueButtonPressed){
   // do your actions if 'continue' button on AlertDialog is not pressed
 } 
 super.dispose();
}
于 2021-03-19T03:14:30.530 回答