未处理的异常:类型 'Future<dynamic>' 不是类型 'Future<alertDialogAction>' 的子类型

Unhandled Exception: type 'Future<dynamic>' is not a subtype of type 'Future<alertDialogAction>'

我正在尝试在 Dart 中制作一个可重复使用的 AlertDialog 并且能够制作一个。 UI 显示并且运行良好。这段代码中唯一的问题是当我按下保存按钮时,它给出了以下错误:未处理的异常:类型 'Future' 不是类型 'Future' 的子类型。下面是我的 AlertDialog class:

enum alertDialogAction { cancel, save }

class Dialogs {
  static Future<alertDialogAction> alertDialog(
    BuildContext context,
    String title,
    String body,
  ) {
    final action = showDialog(
        context: context,
        barrierDismissible: true,
        builder: (BuildContext context) {
          return AlertDialog(
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(10),
            ),
            title: Text(title),
            content: Text(body),
            actions: <Widget>[
              FlatButton(
                  onPressed: () =>
                      Navigator.pop(context,alertDialogAction.cancel),
                  child: Text("cancel")),
              RaisedButton(
                  color: Colors.blueAccent,
                  onPressed: () =>
                      Navigator.of(context).pop(alertDialogAction.save),
                  child: Text(
                    "save",
                    style: TextStyle(color: Colors.white),
                  )),
            ],
          );
        });
    return (action != null) ? action : alertDialogAction.cancel;
  }
 }

这是我在 index.dart 中的称呼:

 final action=await Dialogs.alertDialog(context,"title", "body");
 if (action == alertDialogAction.save){
      //code runs
      }

这是因为您通过声明 final action 来 returning Future<dynamic> 同时您指定了 static 函数的 return 类型 alertDialogFuture<alertDialogAction>.

为避免将来出现此类问题,请始终为您声明的所有变量指定特定类型。

Future<alertDialogAction> action = showDialog(
        context: context,
        barrierDismissible: true,
        builder: (BuildContext context) {
          return AlertDialog(
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(10),
            ),
            title: Text(title),
            content: Text(body),
            actions: <Widget>[
              FlatButton(
                  onPressed: () =>
                      Navigator.pop(context,alertDialogAction.cancel),
                  child: Text("cancel")),
              RaisedButton(
                  color: Colors.blueAccent,
                  onPressed: () =>
                      Navigator.of(context).pop(alertDialogAction.save),
                  child: Text(
                    "save",
                    style: TextStyle(color: Colors.white),
                  )),
            ],
          );
        });

并这样调用

alertDialogAction action=await Dialogs.alertDialog(context,"title", "body");