firebase - 在 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. 创建占位符子对象
在这种方法中,子对象可以具有以下状态:
- Unfetched - id 已填充但其他字段尚未填充(未加载)
- Fetched - 填充 id 并填充(加载)其他字段
- Empty - id 为空字符串(无需加载,没有孩子)
我已经可以感觉到这将是很多样板必须管理模型的状态,更不用说我正在将逻辑引入模型本身,这破坏了诸如 MVC 或 Bloc 模式之类的抽象规则。
有任何现有的解决方案或关于最佳实践的建议吗?
解决方案
推荐阅读
- android - Android忽略区域设置更改,使用默认strings.xml
- makefile - 如果该行的任何必要条件发生变化,gnu make rebuild
- asp.net - 能帮我看看真正的问题是什么吗?
- tensorflow - 权重初始化 Tensorflow tf.estimator
- wordpress - WooCommerce REST API 按 ID 获取多个产品
- python-3.x - 在二维直方图 python 上绘制一条线
- php - PHP 访问 xml 文档的每个子项
- java - Spark 2.0.0:以集群模式从 Cassandra 读取
- asp.net - .NET 身份用户,关注点分离
- python - 索引不匹配的数量,使用 Keras LSTM