【问题标题】:Unhandled Exception: type 'Future<dynamic>' is not a subtype of type 'Future<alertDialogAction>'未处理的异常:类型“Future<dynamic>”不是“Future<alertDialogAction>”类型的子类型
【发布时间】:2020-07-08 19:52:25
【问题描述】:

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

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
      }

【问题讨论】:

  • 我认为你的 textDialog 方法返回 Future 类型。但是在您的 Dialog 类中,您有 alertDialog。这将返回 Future 类型,现在将相等性与 alertDialogAction.save 进行比较。你能用 textDialog 方法更新你的问题吗?
  • @VinothVino 谢谢你的回复,看来我这里复制了错误的代码。我复制了我的 textDialog 类的代码。它应该是等待 Dialogs.alertDialog。很抱歉造成混乱。

标签: flutter dart dialog flutter-alertdialog


【解决方案1】:

这是因为您通过声明final action 来返回Future&lt;dynamic&gt;,同时您将static 函数alertDialog 的返回类型指定为Future&lt;alertDialogAction&gt;

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

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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 2020-09-11
    • 2019-11-10
    • 2020-10-13
    • 2021-02-10
    • 1970-01-01
    • 2020-09-20
    相关资源
    最近更新 更多