Необработанное исключение: тип 'Future <dynamic>' не является подтипом типа 'Future <alertDialogAction>' - PullRequest
1 голос
/ 28 марта 2020

Я пытаюсь сделать многоразовый AlertDialog в Дарт и смог сделать один. Пользовательский интерфейс отображается, и он работает хорошо. Единственная проблема в этом коде состоит в том, что когда я нажимаю кнопку «Сохранить», выдается следующая ошибка: Исключение необработанного типа: тип «Будущее» не является подтипом типа «Будущее». Ниже мой 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
      }

1 Ответ

2 голосов
/ 28 марта 2020

Это потому, что вы возвращаете Future<dynamic>, объявив final action, в то время как вы указали тип возврата static функции alertDialog, равный Future<alertDialogAction>.

Чтобы избежать такой проблемы в будущем всегда указывайте тип c для всех переменных, которые вы объявляете.

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