Интуитивно понятный способ работать с постоянными данными в DART.
Кирпич - это расширяемый интерфейс запроса для приложений DART. Это все в одном решение, ответственное за представление бизнес-данных в приложении, независимо от того, откуда поступают ваши данные. Используя кирпич, разработчики могут сосредоточиться на реализации приложения, не заботясь о том, где живет данные. Кирпич был вдохновлен необходимостью сначала приложения для работы в автономном режиме, даже если API представляет ваш источник истины.
Добавьте пакеты:
dependencies :
# Or brick_offline_first_with_graphql
# Or brick_offline_first_with_supabase
brick_offline_first_with_rest :
sqflite : # optional
dev_dependencies :
# Or brick_offline_first_with_graphql_build: any
# Or brick_offline_first_with_supabase_build: any
brick_offline_first_with_rest_build :
build_runner :Настройте структуру каталогов приложений в соответствии с ожиданиями Брика:
mkdir -p lib/brick/adapters lib/brick/db ; Добавьте модели, которые содержат логику вашей приложения. Модели должны быть сохранены с помощью суффикса .model.dart (т.е. lib/brick/models/person.model.dart ).
Запустите dart run build_runner build , чтобы создать ваши модели, а иногда и миграции. Повторно повторно после каждого изменения новой модели или dart run build_runner watch для автоматических поколений. Вам нужно будет запустить это снова после первой миграции.
Расширить существующий репозиторий или создать свой собственный (Supabase имеет некоторые исключения):
// lib/brick/repository.dart
import 'package:brick_offline_first_with_rest/brick_offline_first_with_rest.dart' ;
import 'package:brick_rest/brick_rest.dart' ;
import 'package:brick_sqlite/brick_sqlite.dart' ;
import 'package:my_app/brick/brick.g.dart' ;
import 'package:sqflite/sqflite.dart' show databaseFactory;
import 'package:my_app/brick/db/schema.g.dart' ;
export 'package:brick_core/query.dart' show And, Or, Query, QueryAction, Where, WherePhrase;
class Repository extends OfflineFirstWithRestRepository {
Repository ()
: super (
migrations : migrations,
restProvider : RestProvider (
'http://0.0.0.0:3000' ,
modelDictionary : restModelDictionary,
),
sqliteProvider : SqliteProvider (
_DB_NAME ,
databaseFactory : databaseFactory,
modelDictionary : sqliteModelDictionary,
),
offlineQueueManager : RestRequestSqliteCacheManager (
'brick_offline_queue.sqlite' ,
databaseFactory : databaseFactory,
),
);
}Выгода.
Создайте модель в качестве бизнес -логики приложения:
// brick/models/user.dart
@ConnectOfflineFirstWithRest ()
class User extends OfflineFirstWithRestModel {}И генерировать (DE) сериализующий код, чтобы получить и из нескольких поставщиков:
$ (flutter) pub run build_runner buildРепозиторий получает и возвращает данные по нескольким провайдерам. Это единственная точка доступа для данных в вашем приложении:
class MyRepository extends OfflineFirstWithRestRepository {
MyRepository ();
}
final repository = MyRepository ();
// Now the models can be queried:
final users = await repository. get < User >();За кулисами этот репозиторий может опросить кеш памяти, затем SQLite, затем API REST. Репозиторий разумно определяет, как и когда использовать каждого из поставщиков, чтобы вернуть самые быстрые и надежные данные.
// Queries can be general:
final query = Query (where : [ Where ( 'lastName' ). contains ( 'Muster' )]);
final users = await repository. get < User >(query : query);
// Or singular:
final query = Query . where ( 'email' , '[email protected]' , limit1 : true );
final user = await repository. get < User >(query : query);Запросы также могут получать реактивные обновления . Подписанный поток получает все модели из своего запроса всякий раз, когда обновляется локальная копия (например, когда данные гидратируются в другой части приложения):
final users = repository. subscribe < User >(). listen ((users) {})Как только модель была создана, она отправляется в хранилище и обратно каждому поставщику:
final user = User ();
await repository. upsert < User >(user);Репозитории могут поддерживать ассоциации и автоматическую (DE) сериализацию детских моделей.
class Hat extends OfflineFirstWithRestModel {
final String color;
Hat ({ this .color});
}
class User extends OfflineFirstWithRestModel {
// user has many hats
final List < Hat > hats;
}
final query = Query . where ( 'hats' , Where ( 'color' ). isExactly ( 'brown' ));
final usersWithBrownHats = repository. get < User >(query : query);Кирпич наступает сериализует примитивы, ассоциации и многое другое.
Если это все еще мутно, ознакомьтесь с поиском видео, учебных пособий и примеров, которые разрушают кирпич.