0

我在干净的架构中使用 Riverpod 和 ObjectBox 和 Flutter 2.8。最近,我一直在解决在 Flutter 中使用 ObjectBox 的一些问题。

我从转换为模型的 API 获取数据。然后在我认为使用它们的实体列表中。

  1. 当我切换到飞行模式时,objectbox 不再显示任何数据。我搜索了,但我找不到任何可以解释这一点的东西。[已解决]

  2. 当我检索我的硬币和与硬币链接的图像时 (OneToOne)。我做了这两个查询来获取它们。有用。我将每个硬币的这两个实体整合到我的列表中。但是我不确定这是呈现数据的最佳方式。

我应该在这里对两个实体进行一次查询吗?要将它们添加到盒子中,会putQueuedputAsync更合适吗?

感谢您对这种情况的所有阅读和观点。我将继续我的研究并编辑这篇文章。

  • 编辑 2021 年 12 月 14 日

好的 !我解决了问题 1. 我的朋友。我完全忘记了对另一个列出我的硬币的实体的连接检查。所以他不是在没有联系的情况下列出清单。现在它起作用了。

仍然对您对第 2 点的看法持开放态度。


class CoinRepositoryImpl extends CoinRepository {

  final CoinRemoteApi _remoteApi;
  final ObjectBoxDatabase _objectBoxDatabase;

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

  @override
  Future<List> getCoinById(selectedCoin) async {

    ConnectivityResult connectivityResult = await (Connectivity().checkConnectivity());
    final _boxCoin = _objectBoxDatabase.store.box<Coin>();
    final _boxImage = _objectBoxDatabase.store.box<Image>();

    if (connectivityResult == ConnectivityResult.wifi) {
      final entitiesList = await getRemoteDataCoin(selectedCoin);

      for (var entity in entitiesList) {
        addEntity(entity);
      }
    }

    final Query<Coin> queryCoin = (_boxCoin.query(Coin_.coinId.equals(selectedCoin))).build();
    int idCoin = queryCoin.findFirst()!.id;
    final Query<Image> queryImage = (_boxImage.query(Image_.id.equals(idCoin))).build();

    List<dynamic> entities = [];
    if (queryCoin.findFirst() != null && queryImage.findFirst() != null) {
      entities.add(queryCoin.findFirst());
      entities.add(queryImage.findFirst());
    }
  }

  @override
  Future<void> addEntity(object) async {
    final _boxCoin = _objectBoxDatabase.store.box<Coin>();
    final _boxImage = _objectBoxDatabase.store.box<Image>();

    if (object.runtimeType == Coin) {
      _boxCoin.put(object);
    }
    if (object.runtimeType == Image) {
      _boxImage.put(object);
    }
  }

// Retrieves remote data and formats it in models. 
// Then, its models are injected into the entities with toEntities.  
Future<List> getRemoteDataCoin(selectedCoin) async {
    return _remoteApi.getCoinById(
        selectedCoin,
        const CoinRequest(
            localization: 'false',
            tickers: false,
            marketData: false,
            communityData: true,
            developerData: false,
            sparkline: false
        )
    ).then(
        (value) => value.toEntities()
    );
  }
}
class ObjectBoxDatabase {
  late final Store store;
  late final Box<Coin> _boxCoin;
  late final Box<Image> _boxImage;

  ObjectBoxDatabase._create(this.store) {
    _boxCoin = store.box();
    _boxImage = store.box();
  }

  static Future<ObjectBoxDatabase> initialization() async {
    final store = await openStore();
    return ObjectBoxDatabase._create(store);
  }
}
@Entity()
class Coin extends Equatable {
  int id;
  @Index()
  final String coinId;
  final String symbol;
  final String name;
  final image = ToOne<Image>();
  @Property(type: PropertyType.date)
  final DateTime lastUpdated;
  final coinList = ToOne<CoinsList>();

  Coin({
    this.id = 0,
    required this.coinId,
    required this.symbol,
    required this.name,
    required this.lastUpdated,
  });

  @override
  List<Object?> get props => [
    id,
    coinId,
    symbol,
    name,
    lastUpdated,
  ];
}
@Entity()
class Image extends Equatable {
  int id;
  final String thumb;
  final String small;
  final String large;
  final coin = ToOne<Coin>();

  Image({
    this.id = 0,
    required this.thumb,
    required this.small,
    required this.large,
  });

  @override
  List<Object?> get props => [
    id,
    thumb,
    small,
    large,
    coin
  ];
}
4

0 回答 0