Что такое репозиторий (Repository) в архитектуре Flutter-приложения?

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

Ответ

Репозиторий — это паттерн уровня данных, который выступает в роли единого источника правды для доменного слоя. Он абстрагирует детали получения данных (из сети, локальной БД, кэша в памяти), предоставляя чистый API для бизнес-логики.

Зачем он нужен во Flutter?

  • Изоляция: Бизнес-логика (Use Cases/Bloc/Cubit) не знает, откуда берутся данные — из REST API, GraphQL, Firebase или SharedPreferences.
  • Гибкость: Можно легко подменить источник данных (например, использовать мок для тестов) или добавить новый (например, кэш Hive поверх Firestore).
  • Централизация логики данных: Повторяющиеся операции (кэширование, повторные запросы при ошибке, преобразование DTO в модель) живут в одном месте.

Пример реализации на Dart/Flutter:

// Доменная модель
class User {
  final String id;
  final String name;
  User({required this.id, required this.name});
}

// Абстракция репозитория
abstract class UserRepository {
  Future<User> getUser(String id);
  Future<List<User>> searchUsers(String query);
}

// Конкретная реализация
class UserRepositoryImpl implements UserRepository {
  final UserRemoteDataSource _remoteDataSource;
  final UserLocalDataSource _localDataSource;

  UserRepositoryImpl(this._remoteDataSource, this._localDataSource);

  @override
  Future<User> getUser(String id) async {
    // Сначала проверяем локальное хранилище
    try {
      final localUser = await _localDataSource.getUser(id);
      return localUser;
    } catch (_) {
      // Если нет локально, идем в сеть и сохраняем результат
      final remoteUser = await _remoteDataSource.getUser(id);
      await _localDataSource.saveUser(remoteUser);
      return remoteUser;
    }
  }

  @override
  Future<List<User>> searchUsers(String query) {
    // Для поиска всегда идем в сеть, но можно добавить и кэширование
    return _remoteDataSource.searchUsers(query);
  }
}

В Clean Architecture или BLoC репозиторий — это мост между Data Layer и Domain Layer.