首页 > 解决方案 > 在 Flutter/dart 中延迟加载 Firestore 异物

问题描述

我对这个主题的很多搜索似乎都涉及到分页。也许我问错了问题。如果是这样,请帮助编辑问题以使其有意义。

我所说的延迟加载外来对象是指仅加载字符串 id 或引用路径并在需要时将其转换为 dart 对象的行为。我正在尝试复制Ormlite 的 Foreign Object Fields的实现。

对于集合之间的复杂关系,这似乎是不费吹灰之力,因为如果我不需要,我不想读取引用的对象。然而,我似乎找不到任何方法可以轻松地使用 Firebase 做到这一点。

让我们以以下简单的数据模型示例为例:

class Parent {
  String id;
  Child child;
}

class Child {
  String id;
  String description = 'child of parent';
  ParentCousin parentCousin;
}

class ParentCousin {
  String id;
  ChildCousin child;
}

class ChildCousin {
  String id;
  String description = 'child of ParentCousin';
}

这只是一个简单的模型来演示延迟加载对象的必要性。您可以想象,如果关系变得更复杂一点,预先加载所有对象将是繁重且不必要的。是否有最佳实践来构建一个在调用时延迟获取引用对象的数据模型?到目前为止我的想法是:

1. 将每个引用的数据模型包装在一个 Map<String, Object> objRef

这样,父对象的获取操作会将 id 存储为带有初始 null 对象的键。只有在引用 objRef['id'] 时才会创建该对象。

2. 将每个引用的数据模型包装在一个专门的 Reference 类中

与第一种方法类似,引用类将包含一个 id 和对象。这种方法的优势意味着该类可以具有由父级定义的关于如何获取其子级的专门方法。参见示例:

class Reference<T> {
  String id;
  T _object; 
  T Function() fetch;

  // Todo Constructor

  T get object => fetch;
}

3. 创建占位符子对象

在这种方法中,子对象可以具有以下状态:

我已经可以感觉到这将是很多样板必须管理模型的状态,更不用说我正在将逻辑引入模型本身,这破坏了诸如 MVC 或 Bloc 模式之类的抽象规则。

有任何现有的解决方案或关于最佳实践的建议吗?

标签: firebaseflutterdartgoogle-cloud-firestore

解决方案


推荐阅读