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
相关产品推荐
相关产品推荐

