You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter 2.5结合Riverpod使用ObjectBox实例化store与box的实践方案

Flutter 2.5搭配Riverpod使用ObjectBox实现数据缓存的实例化问题

我在Flutter 2.5环境下搭配Riverpod使用ObjectBox,目标是实现API大量数据的快速缓存。
如果远端数据与box内存储的数据存在差异就执行更新,确保用户断网时也能正常访问有效数据。
请问有没有开发者成功在Flutter整洁架构下搭配Riverpod完成ObjectBox的实例化及最优使用?我找到了两个相关问题,但目前我还没得到满意的实现方案。
如果大家有相关实现建议欢迎提供,我已经参考了ObjectBox官方更新的store创建示例代码。
我现在遇到的报错都是同类问题,要么_box或store未实例化,要么返回空值,我会随着调研进度更新帖子内容。

[ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: LateInitializationError: Field '_box@59089156' has not been initialized.

[ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: LateInitializationError: Field 'store' has not been initialized.
2021年10月21日更新

好的,感谢各位同行的帮助和评论,我已经更新了对应的代码,现在已经没有store或box实例化的问题了。
我的代码如下:

abstract class LocalDataSourceRepository<T> {
  Future<Coin?> getCoinById(dynamic id);
  Future<void> addCoin(T object);
}

远端/本地数据管理逻辑在如下实现类中,其中getRemoteDataCoin方法会从API拉取完整币种数据并转换为实体类。

class CoinRepositoryImpl extends LocalDataSourceRepository {

  final CoinRemoteApi _remoteApi;
  final ObjectBoxDatabase _objectBoxDatabase;

  CoinRepositoryImpl(
      this._remoteApi,
      this._objectBoxDatabase,
  );

  @override
  Future<Coin?> getCoinById(id) async {
    final _box = _objectBoxDatabase.store.box<Coin>();
    final Query<Coin> query = (_box.query(Coin_.coinId.equals(id))).build();

    if (query.findUnique() == null) {
      final coin = await getRemoteDataCoin(id);
      addCoin(coin);
      return query.findUnique();
    } else {
      return query.findUnique();
    }
  }

  @override
  Future<void> addCoin(object) async {
    final _box = _objectBoxDatabase.store.box<Coin>();
    _box.put(object);
  }

  Future<Coin> getRemoteDataCoin(selectedCoin) async {
    return _remoteApi.getCoinById(
        selectedCoin,
        const CoinRequest(
            localization: 'false',
            tickers: false,
            marketData: false,
            communityData: true,
            developerData: false,
            sparkline: false
        )
    ).then(
          (value) => value.toEntity(),
    );
  }
}
class ObjectBoxDatabase {
  late final Store store;
  late final Box<Coin> _box;

  ObjectBoxDatabase._create(this.store) {
     _box = Box<Coin>(store);
  }

  static Future<ObjectBoxDatabase> create() async {
    final store = await openStore();
    return ObjectBoxDatabase._create(store);
  }
}

我的Riverpod provider代码如下:

final localCoinDatabaseProvider = Provider<ObjectBoxDatabase>((ref) => throw UnimplementedError());
final remoteCoinApiProvider = Provider<CoinRemoteApi>((ref) => CoinRemoteApi());

final coinRepositoryProvider = Provider<LocalDataSourceRepository>((ref) => CoinRepositoryImpl(
    ref.read(remoteCoinApiProvider),
    ref.read(localCoinDatabaseProvider)
));
Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final objectBox = await ObjectBoxDatabase.create();
  runApp(
      ProviderScope(
          overrides: [
            localCoinDatabaseProvider.overrideWithValue(objectBox)
          ],
          child: const MyApp()
      )
  );
}

内容的提问来源于stack exchange,提问作者Sheitak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:57:01