브릭 오프라인 우선 도메인을 위한 코드 생성 라이브러리로, GraphQL과 통합되어 로컬 스토리지와 원격 API 간의 원활한 데이터 동기화를 가능하게 합니다. GraphQL 스키마를 기반으로 Dart 모델과 리포지토리 로직을 생성하여 오프라인 우선 앱 개발을 단순화합니다. 이 패키지는 여러 플랫폼을 지원하며 타입 안전하고 유지보수 가능한 데이터 계층 구축을 간소화합니다. 코드 생성을 활용함으로써 반복 코드를 줄이고 개발자 생산성을 향상시킵니다.
사용 사례
오프라인 우선 모바일 애플리케이션 빌드
로컬 및 원격 GraphQL 엔드포인트 간의 데이터 동기화
모델 및 저장소 생성 자동화
타입 안전한 데이터 액세스 계층 만들기
앱에서 실시간 데이터 업데이트 활성화
데이터 레이어 구현에서 수동 보일러플레이트 줄이기
주요 기능
GraphQL 스키마에서 Dart 클래스 생성
오프라인 우선 데이터 지속성 지원
Brick의 도메인 아키텍처와 통합됩니다
저장소 구현을 생성합니다
데이터 작업 간의 타입 안전성을 보장합니다
로컬 데이터와 원격 데이터 간의 자동 동기화를 촉진합니다
적합한 대상
오프라인 우선 앱을 위한 브릭 사용 개발자
GraphQL 기반 모바일 앱을 개발하는 팀
강력한 로컬 데이터 처리가 필요한 프로젝트
자동 데이터 동기화가 필요한 앱
코드 생성 도구를 찾는 Dart 개발자
유지보수 가능한 데이터 레이어 설계를 우선시하는 프로젝트
고려 사항
Brick 및 GraphQL에 익숙해야 합니다
코드 생성을 위해 적절한 스키마 정의가 필요합니다
코드 생성으로 인해 빌드 시간이 증가할 수 있습니다
스키마 관리를 위한 외부 도구에 의존
복잡한 데이터 요구 사항을 가진 대규모 프로젝트에 가장 적합
주류 패키지에 비해 문서가 제한적
원본 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);