Изучение
Начало работы
Создание типизированного DataSourceContainer и Repository, публикующего доменные данные.
Безопасная версия SDK
Для сборки и распространения приложений используйте Dart 3.13.7+ или Flutter 3.47.8+. Это первые исправленные stable-версии для инцидента eMudhra; в дальнейшем выбирайте актуальный поддерживаемый SDK с исправлениями безопасности.
Минимальная версия в pubspec описывает совместимость API, а не безопасность старой среды исполнения. Пакеты проверены на Dart 3.13.7 и Flutter 3.47.8 без изменения публичного API. Новая версия библиотеки не исправляет уже установленное приложение: затронутые Android, Windows и Linux приложения нужно пересобрать и распространить заново.
Проверьте SDK в IDE, локальной сборке и CI. Обновление глобального SDK на компьютере не гарантирует, что конкретный проект или CI использует именно его. Не отключайте проверку сертификатов для обхода ошибок TLS.
Установка
dart pub add ark_data_layer
Контракт источника
abstract interface class UserRemoteDataSource implements DataSource {
Future<List<UserDto>> fetchUsers();
}
DataSource — маркерный интерфейс. Приложение определяет полезный контракт и ограничивает его одной технической ответственностью.
Реализация Repository
final class UserRepositoryImpl extends Repository<UsersData>
implements UserRepository {
UserRepositoryImpl({required super.dataSources})
: _remote = dataSources.get<UserRemoteDataSource>(),
super(initialData: const UsersData.empty());
final UserRemoteDataSource _remote;
@override
Future<void> refresh() async {
final records = await _remote.fetchUsers();
setData(UsersData(records.map(mapUser)));
}
}
Конкретный класс расширяет базовый класс пакета и реализует доменный интерфейс приложения. Вызывающий код зависит от UserRepository, а не от DataSourceContainer.
Композиция и закрытие
final repository = UserRepositoryImpl(
dataSources: DataSourceContainer(<DataSource>[remoteSource]),
);
await repository.refresh();
await repository.close();
await remoteSource.close();
Repository закрывает собственный механизм публикации, но не закрывает DataSource, которым владеет внешний Scope.