Brick를 사용하여 오프라인 우선 데이터 전략을 구현하는 플러터 패키지로, Supabase에 접근하기 전에 로컬 스토리지 공급자를 통해 데이터 요청을 라우팅합니다. 이는 인터넷 연결 없이도 캐시된 데이터를 우선적으로 활용하고 가능할 때 Supabase와 동기화함으로써 원활한 사용자 경험을 보장합니다. Supabase의 PostgreSQL 데이터베이스와 원활하게 통합되어 플랫폼 간 지속적이고 실시간 데이터 처리를 가능하게 합니다.
사용 사례
오프라인 우선 모바일 애플리케이션
Supabase와 실시간 데이터 동기화
크로스 플랫폼 데이터 지속성
신뢰할 수 있는 로컬 데이터 접근이 필요한 앱
네트워크 장애 시 세이프백
주요 기능
로컬 우선 데이터 라우팅
Supabase 통합
연결 시 자동 동기화
지속적인 SQL 저장소
크로스 플랫폼 지원
내장 캐시 레이어
적합한 대상
탄력적인 앱을 개발하는 개발자
백엔드로 Supabase를 사용하는 팀
오프라인 기능이 필요한 프로젝트
다중 플랫폼을 대상으로 하는 Flutter 앱
실시간 데이터 업데이트가 필요한 응용 프로그램
고려 사항
브릭 아키텍처에 대한 이해가 필요합니다
완전한 기능을 사용하려면 Supabase 계정이 필요합니다
동기화 로직을 위한 추가 설정
로컬 저장으로 인해 앱 크기가 증가할 수 있습니다
최적의 동기화를 위해 네트워크 상태 처리가 필요합니다
원본 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);