Что такое Interactor в архитектуре Flutter-приложения?

«Что такое Interactor в архитектуре Flutter-приложения?» — вопрос из категории Архитектура, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Interactor (Сценарий использования) — это компонент в архитектурах типа Clean Architecture или DDD, который инкапсулирует конкретную бизнес-правило или операцию. Его задача — оркестрировать поток данных между репозиториями (источниками данных) и презентационным слоем, выполняя чистую бизнес-логику.

Ключевые принципы:

  • Отделение логики: Interactor не знает о UI (Widgets) или конкретных источниках данных (база данных, API). Он работает с абстракциями (репозиториями).
  • Одна ответственность: Каждый интерактор отвечает за одну бизнес-операцию (например, «аутентификация пользователя», «получение списка новостей»).

Пример на Dart (используя пакет flutter_bloc):

// Абстракция репозитория
abstract class AuthRepository {
  Future<User> login(String email, String password);
}

// Interactor (часто реализуется как UseCase)
class LoginUseCase {
  final AuthRepository _authRepository;

  LoginUseCase(this._authRepository);

  Future<Either<Failure, User>> execute(LoginParams params) async {
    // Валидация параметров (бизнес-правило)
    if (!params.isValid) {
      return Left(ValidationFailure());
    }
    // Вызов репозитория и обработка результата
    try {
      final user = await _authRepository.login(params.email, params.password);
      return Right(user);
    } on SocketException {
      return Left(NetworkFailure());
    } on ApiException catch (e) {
      return Left(ServerFailure(message: e.message));
    }
  }
}

// Параметры для инкапсуляции входных данных
class LoginParams {
  final String email;
  final String password;
  LoginParams(this.email, this.password);
  bool get isValid => email.isNotEmpty && password.length >= 6;
}

Преимущества: Такой подход делает бизнес-логику независимой, легко тестируемой (можно мокать репозиторий) и переиспользуемой.