Изучение

Начало работы

Создание типизированного DataSourceContainer и Repository, публикующего доменные данные.

v1.2.1Начальный уровеньark_data_layer

Безопасная версия 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.

Установка

Терминал
shell
dart pub add ark_data_layer

Контракт источника

dart
abstract interface class UserRemoteDataSource implements DataSource {
  Future<List<UserDto>> fetchUsers();
}

DataSource — маркерный интерфейс. Приложение определяет полезный контракт и ограничивает его одной технической ответственностью.

Реализация Repository

dart
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.

Композиция и закрытие

dart
final repository = UserRepositoryImpl(
  dataSources: DataSourceContainer(<DataSource>[remoteSource]),
);

await repository.refresh();
await repository.close();
await remoteSource.close();

Repository закрывает собственный механизм публикации, но не закрывает DataSource, которым владеет внешний Scope.