Brick Offline First 도메인을 위한 코드 생성 라이브러리로 REST API와의 원활한 통합을 가능하게 합니다. 데이터 모델, 리포지토리 및 동기화 로직을 관리하기 위해 Dart 코드를 생성하며, 오프라인 우선 애플리케이션 개발을 지원합니다. 어노테이션을 활용하여 CRUD 작업과 상태 관리에 대한 반복 코드를 자동화하고, 로컬 저장소와 원격 REST 엔드포인트 간의 일관성을 보장합니다. 다양한 플랫폼에서 신뢰할 수 있는 데이터 지속성과 동기화 기능이 필요한 앱에 적합합니다.
사용 사례
오프라인 우선 모바일 애플리케이션 빌드
로컬 데이터를 REST API와 동기화
저장소 및 모델 생성 자동화
분산 데이터 환경에서 상태 관리
크로스 플랫폼 앱을 위한 확장 가능한 데이터 계층 만들기
주요 기능
주석 기반 코드 생성
REST API 통합 지원
오프라인 우선 데이터 동기화
자동 리포지터리 및 모델 생성
크로스 플랫폼 호환성
적합한 대상
오프라인 기능을 갖춘 앱을 개발하는 개발자
REST 백엔드를 사용하는 팀
자동 데이터 계층 생성이 필요한 프로젝트
크로스플랫폼 플러터 애플리케이션
강력한 데이터 지속성 요구 앱
고려 사항
Brick 프레임워크에 대한 이해가 필요합니다
정확한 주석 사용에 의존합니다
코드 생성으로 인해 빌드 시간이 증가할 수 있습니다
REST 기반 백엔드 통합에 제한됨
코드 생성 워크플로를 채택한 프로젝트에 가장 적합
원본 README
연결된 소스 저장소의 README 원문 스냅샷입니다. 최신 내용은 저장소에서 확인하세요.
An intuitive way to work with persistent data in Dart.
Brick is an extensible query interface for Dart applications. It's an all-in-one solution responsible for representing business data in the application, regardless of where your data comes from. Using Brick, developers can focus on implementing the application, without concern for where the data lives. Brick was inspired by the need for applications to work offline first, even if an API represents your source of truth.
Quick Start
Add the packages:
dependencies:# Or brick_offline_first_with_graphql# Or brick_offline_first_with_supabasebrick_offline_first_with_rest:sqflite:# optionaldev_dependencies:# Or brick_offline_first_with_graphql_build: any# Or brick_offline_first_with_supabase_build: anybrick_offline_first_with_rest_build:build_runner:
Configure your app directory structure to match Brick's expectations:
mkdir -p lib/brick/adapters lib/brick/db;
Add models that contain your app logic. Models must be saved with the .model.dart suffix (i.e. lib/brick/models/person.model.dart).
Run dart run build_runner build to generate your models and sometimes migrations. Rerun after every new model change or dart run build_runner watch for automatic generations. You'll need to run this again after your first migration.
And generate (de)serializing code to fetch to and from multiple providers:
$ (flutter) pub run build_runner build
Fetching Data
A repository fetches and returns data across multiple providers. It's the single access point for data in your app:
classMyRepositoryextendsOfflineFirstWithRestRepository{
MyRepository();
}
final repository = MyRepository();
// Now the models can be queried:final users = await repository.get<User>();
Behind the scenes, this repository could poll a memory cache, then SQLite, then a REST API. The repository intelligently determines how and when to use each of the providers to return the fastest, most reliable data.
// 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', 'user@example.com', limit1: true);
final user = await repository.get<User>(query: query);
Queries can also receive reactive updates. The subscribed stream receives all models from its query whenever the local copy is updated (e.g. when the data is hydrated in another part of the app):
final users = repository.subscribe<User>().listen((users) {})
Mutating Data
Once a model has been created, it's sent to the repository and back out to each provider:
final user = User();
await repository.upsert<User>(user);
Associating Data
Repositories can support associations and automatic (de)serialization of child models.
classHatextendsOfflineFirstWithRestModel{
finalString color;
Hat({this.color});
}
classUserextendsOfflineFirstWithRestModel{
// user has many hatsfinalList<Hat> hats;
}
final query = Query.where('hats', Where('color').isExactly('brown'));
final usersWithBrownHats = repository.get<User>(query: query);