Как пропустить (в стеке методов) исключение во флаттере? - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь создать приложение REST, которое использует связь HTTP Get для входа во Flutter.Хотя у меня не было проблем с импортом пакета "http / http.dart" и запуском методов класса http, я столкнулся с проблемой обработки исключений в Dart / Flutter.Я создал метод для вызова http, но если соединение по какой-либо причине не работает, оно, естественно, выдаст исключение «SocketException».У меня нет проблем с обработкой исключения в том же методе, который сделал запрос get, но если я попытаюсь передать его в стеке метода вызывающей функции родительскому методу, я просто не смогу его перехватить снова.Я нашел ключевое слово «rethrow», но до сих пор не удалось перебросить исключение.Ниже приведены некоторые методы, которые я использую в своем коде, как метод входа в систему и метод вызова:

static Future<JsonEnvelop> loginUser(String email, String passwd) async {

    List<int> content = Utf8Encoder().convert(passwd);
    crypto.Digest digest = crypto.md5.convert(content);

    String url = _baseUrl + _loginUrl + email + "/" + digest.toString();

    http.Response response;
    try {
      response = await http.get(url);
    } on SocketException catch(e) {
      rethrow;
    }

    if(response != null && response.statusCode == 200) {
      return JsonEnvelop.fromJson(json.decode(response.body));
    } else {
      throw Exception('Failed to login');
    }
  }

void onVerifyCodeBtnPressed(BuildContext context) {
    if (_formKey.currentState.validate()) {
      String email = _emailController.text;
      String passwd = _passwdController.text;

      Future<JsonEnvelop> envelop;
      try {
        envelop = RemoteUserServices.loginUser(
            email, passwd);
      } on SocketException {
        throw Exception('Internet is down');
      }
      Scaffold.of(context).showSnackBar(SnackBar(content: Text('Login to your account')));

      envelop.then((JsonEnvelop envelop) {
        showDialog(
          context: context,
          builder: (BuildContext context) {
            return AlertDialog(
              title: new Text("Login"),
              content: new Text("Login Successful"),
              actions: <Widget>[
                new FlatButton(
                  child: new Text("OK"),
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                )
              ],
            );
          }
        );
      });
    } else {
      showDialog(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            title: new Text("Missing data"),
            content: new Text("Type your email and password in the fields"),
            actions: <Widget>[
              new FlatButton(
                child: new Text("OK"),
                onPressed: () {
                  Navigator.of(context).pop();
                },
              )
            ],
          );
        }
      );
    }
  }

В чем может быть проблема в этой ситуации?Я надеюсь создать диалоговое окно, предупреждающее пользователя, что Интернет не работает.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

try / catch с исключениями из асинхронного кода работает только в функциях с async, в противном случае вам нужно будет передать onError обратные вызовы или использовать .catchError(...) в возвращаемом Future, что заметно большетрудно получить права.

  void onVerifyCodeBtnPressed(BuildContext context) async { // added async 
    if (_formKey.currentState.validate()) {
      String email = _emailController.text;
      String passwd = _passwdController.text;

      Future<JsonEnvelop> envelop;
      try {
        envelop = await RemoteUserServices.loginUser( // added `await`
            email, passwd);
      } on SocketException {
        throw Exception('Internet is down');
      }
0 голосов
/ 28 февраля 2019

Вместо использования rethrow или бросания нового исключения.вернуть Future.error ()

Future<bool> methodThatErrorsOnCall() {
 return Future.error();
}
...
...
methodThatErrorsOnCall.catchError((e) {
  print('I want to show a dialog: ${e.error}');     // callback fires.
  return false;                                     // Future completes with false
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...