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