搜索插件、代码仓与 APP 分类

brick_offline_first 封面
插件详情v4.0.2

brick_offline_first

一个 Brick 域,通过本地提供程序在远程提供程序之前路由数据获取。

AndroidiOSmacOSWindowsLinux
近 30 天下载
2520
喜欢数
117
Pub 分数
150

安装插件

flutter pub add brick_offline_first

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

Brick Offline First 是一个 Flutter/Dart 包,优先使用本地数据源进行数据获取,确保无缝的离线功能。它会先通过本地提供者路由请求,再尝试远程请求,从而提高应用程序的响应速度和可靠性。适用于需要在任何网络状况下保持一致用户体验的应用程序,该包可与持久性 NoSQL 数据库集成,以高效管理数据同步。该包支持 Android、iOS、macOS、Windows 和 Linux 多个平台,使其在跨平台开发中具有高度灵活性。

适合场景

  • 离线优先的移动应用
  • 设备间的数据同步
  • 高可靠性数据访问
  • 渐进式网络应用
  • 实时协作工具

主要特点

  • 本地优先的数据路由
  • 自动回退到本地数据
  • 跨平台支持
  • 与远程源高效同步
  • 与 NoSQL 持久化集成

适合对象

  • 需要离线功能的应用程序
  • 开发人员优先考虑数据韧性
  • 使用持久化存储的项目
  • 构建实时功能的团队
  • 具有间歇性连接的应用程序

使用建议

  • 需要设置本地数据提供者
  • 可能需要自定义同步逻辑
  • 新用户的上手曲线
  • 取决于底层 NoSQL 实现
  • 潜在的复杂性在冲突解决中

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

An intuitive way to work with persistent data

An intuitive way to work with persistent data in Dart.

Full documentation

Why Brick?

What is Brick?

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

  1. Add the packages:

    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:
    
  2. Configure your app directory structure to match Brick's expectations:

    mkdir -p lib/brick/adapters lib/brick/db;
    
  3. Add models that contain your app logic. Models must be saved with the .model.dart suffix (i.e. lib/brick/models/person.model.dart).

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

  5. Extend an existing repository or create your own (Supabase has some exceptions):

    // 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,
              ),
            );
    }
    
  6. Profit.

Usage

Create a model as the app's business logic:

// brick/models/user.dart
@ConnectOfflineFirstWithRest()
class User extends OfflineFirstWithRestModel {}

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:

class MyRepository extends OfflineFirstWithRestRepository {
  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.

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);

Brick natively serializes primitives, associations, and more.

If it's still murky, check out Learn for videos, tutorials, and examples that break down Brick.

所属分类

依赖

依赖清单 9 项

源码仓库

使用此插件的项目

暂无相关数据。