如何从Flutter中的方法获得AlertDialog回调?

9bfwbjaz  于 2023-01-27  发布在  Flutter
关注(0)|答案(3)|浏览(191)

我在静态方法中有AlertDialog,因为我希望在用户单击OK按钮时获得回调。
我尝试使用typedef,但无法理解。
下面是我的代码:

class DialogUtils{

  static void displayDialogOKCallBack(BuildContext context, String title,
      String message)
  {
    showDialog(
      context: context,
      builder: (BuildContext context) {
         return AlertDialog(
          title: new Text(title, style: normalPrimaryStyle,),
          content: new Text(message),
          actions: <Widget>[
            new FlatButton(
              child: new Text(LocaleUtils.getString(context, "ok"), style: normalPrimaryStyle,),
              onPressed: () {
                Navigator.of(context).pop();
                // HERE I WANTS TO ADD CALLBACK
              },
            ),
          ],
        );
      },
    );
  }
}
j91ykkif

j91ykkif1#

您只需等待对话框解除{返回null}或通过单击OK(在本例中,将返回true)关闭

class DialogUtils {
  static Future<bool> displayDialogOKCallBack(
      BuildContext context, String title, String message) async {
    return await showDialog<bool>(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: new Text(title, style: normalPrimaryStyle,),
          content:  Text(message),
          actions: <Widget>[
             FlatButton(
              child:  Text(LocaleUtils.getString(context, "ok"), style: normalPrimaryStyle,),
              onPressed: () {
                Navigator.of(context).pop(true);
                // true here means you clicked ok
              },
            ),
          ],
        );
      },
    );
  }
}

然后当你调用displayDialogOKCallBack的时候你应该await来得到结果
示例:

onTap: () async {
  var result =
  await DialogUtils.displayDialogOKCallBack();

  if (result) {
   // Ok button is clicked
  }
}
toe95027

toe950272#

然后回调函数以用于将来的工作:

DialogUtils.displayDialogOKCallBack().then((value) {
  if (value) {
   // Do stuff here when ok button is pressed and dialog is dismissed. 
  }
});
disbfnqx

disbfnqx3#

这条线索有点旧,但我发现了一个尚未触及的解决方案,所以我想在这里添加它。
我的AlertDialog中有一个表单,如果有任何错误,我需要保持对话框打开。这个解决方案对我很有效。

final GlobalKey<FormState> formKey = GlobalKey<FormState>();

Future _showEditDialog(BuildContext context) {
  return showDialog(
    context: context,
    builder: (context) {
      return WillPopScope(
        onWillPop: () async {
          return formKey.currentState!.validate();
        },
        child: AlertDialog(
          title: const Text("Awesome AlertDialog"),
          content: SingleChildScrollView(
            physics: const BouncingScrollPhysics(),
            child: Form(
              key: formKey,
              child: Column(
                children: [
                  TextFormField(
                    validator: (value) {
                      if (value!.isEmpty) return "Please Fill Out This Field";
                      return null;
                    },
                  ),
                ],
              ),
            ),
          ),
          actions: <Widget>[
            MaterialButton(
              child: const Text("Cancel"),
              onPressed: () {
                Navigator.pop(context);
              },
            ),
          ],
        ),
      );
    },
  );
}

重要的部分是我 Package AlertDialog的WillPopScope。我认为这吸收了所有的Navigator.pop()调用,并通过onWillPop参数传递它们。这个参数传递了一个异步函数,该函数返回一个Future。我刚刚返回了验证检查布尔值,但在真实的世界中,这里也会有一个http请求。
记住添加一种方法,让用户可以取消表单而不触发表单验证。我只是添加了一个运行Navigator.pop()的取消按钮。
希望这对你有帮助,如果有人有任何问题,请告诉我。

相关问题