Простой способ создать хорошую обработку ошибок во Flutter с помощью Dartz

Как разработчики, наша основная задача — создавать приложения для решения определенных задач. При публикации приложение, которое мы разрабатываем, может выдавать некоторые ошибки перед пользователем. Например, наши пользователи могут неправильно ввести данные, потерять соединение или даже наш сервер не работает.

Хорошее приложение сможет справиться с ошибкой и направить пользователя на правильный путь. Мы, конечно, не хотим, чтобы из-за того, что приложение не может справиться с такими незначительными ошибками, как потеря соединения, пользователь решил удалить его.

В этой статье я покажу, как создать хорошую обработку ошибок в проекте Flutter с помощью Dartz.

Реализация

Прежде всего, нам нужно выяснить, какие ошибки могут произойти. Например, в потоке входа в систему распространенной ошибкой является:

  • Пользователь ввел неправильный пароль или электронная почта не зарегистрирована
  • Возможно, на сервере возникли проблемы
  • Потеряно интернет-соединение

Теперь добавим нужный нам пакет в файл pubspec.yaml:

...
dependencies:
    flutter:
        sdk: flutter

    dartz: ^0.10.1
    ...
Вход в полноэкранный режим Выйти из полноэкранного режима

Внутри пакета Dartz мы будем использовать класс Either<L,R>. Этот класс будет использоваться для возврата двух разных вещей в функции.

/// Create variety of exceptions
/// Enum to help create conditions
enum LoginFailure { invalidCredentials, error }

/// Repository
/// This class can be consumed by controller, provider, or other state management later
class SomeRepository {
  final http.Client _client;

  Future<Either<LoginFailure, bool>> login(String email, String password) async {
    final _response = await _client.post(
      Uri.parse(Urls.nowPlayingMovies),
      body: {'email': email, 'password': password}
    );

    if (_response.statusCode == 201) {
      return Right(true);
    } else if (_response.statusCode == 400) {
      return Left(LoginFailure.invalidCredentials);
    } else {
      return Left(LoginFailure.error);
    }
  }

  ...
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Есть функция с типом Future<Either<LoginFailure, bool>>. Теперь, используя этот тип, я могу возвращать из этой функции 2 разные вещи. Если запрос успешен (с кодом состояния 200), то в качестве правильного значения будет возвращено boolean true. Если запрос не удался, я могу легко справиться с этим, вернув перечисление в качестве левого значения. Класс enum действует как помощник для создания условий.

Вот так мы используем функцию login, например, в controller:

class SomeController {
  Future login(String email, String password) async {
    final _result = await _repository.login(email, password);
    _result.fold(
      (l) {
        /// Handle left
        /// For example: show dialog or alert
      },
      (r) {
        /// Handle right
        /// For example: navigate to home page
      },
    );
  }
}
Войти в полноэкранный режим Выход из полноэкранного режима

Теперь вы можете создать несколько пользовательских взаимодействий, например, вот так.

Обзор

Итак, это способ реализовать хорошую обработку ошибок на Flutter. Термин «хорошая» означает, что наше приложение имеет более богатую обработку ошибок, чтобы помочь пользователю понять, если что-то не так при использовании приложения.

Спасибо за прочтение. Надеюсь, эти короткие советы помогут вам написать более чистую, лаконичную и надежную кодовую базу для вашего проекта на Flutter.

Если вы нашли эту статью полезной, пожалуйста, оставьте для меня несколько значков реакции, если вы не против. Кроме того, следите за мной, чтобы получать обновления о моих последних статьях в будущем.

Оцените статью
Procodings.ru
Добавить комментарий