flutter - 如何将依赖于另一个流的流映射到依赖于两个流的新模型?
问题描述
我有 2 个 Firestore 流,其中第二个依赖于第一个。我想发出依赖于来自两个流的数据的新模型。
在伪代码中,您可以通过以下方式来考虑它:
// 1st stream emits some device data
final streamA = client.device(id: 0); // Stream<DeviceData>
// 2nd stream emits some metadata for the above device type
final streamB = client.deviceMetadata(type: device.type); // Stream<DeviceMetadata>
// and finally I want to receive stream of combined device (device data + metadata)
final combinedObject = Device.from(deviceData, deviceMetadata);
但是,在访问源流中的值时,我找不到将流映射到另一个流的有效方法。例如,.map()
我想写:
return client.device('deviceId')
.map((device) => client.deviceMetadata(type: device.type))
.map((deviceMetadata) => Device.from(???, deviceMetadata));
问题当然是我不知道如何访问device
第二个map()
。
我可以使用什么流转换或rxdart
扩展来实现这一点?
解决方案
好的,经过一些调整,我想我找到了解决方案
// get the initial stream
final deviceStream = client.device(id: id);
// create new stream depending on the first one
final deviceTypeStream = deviceStream.flatMap( // make sure to flatten the stream so that it's not Stream<Stream<..>>
(device) => client.deviceMetadata(type: device.type),
);
// use withLatestFrom to capture the latest value from the deviceTypeStream
// and create desired object out of that
return deviceTypeStream.withLatestFrom<DeviceData, Device>(
deviceStream,
(deviceType, device) => Device(device, deviceType),
);
推荐阅读
- python - 出现 Django 2.1.5 服务器错误。请联系管理员“错误:UnicodeDecodeError
- c++ - node.prev.next = ... 和 node = 之间的区别
- authentication - 将当前用户数据从本地存储存储到 vue 存储的最佳实践?
- javascript - Vue中缺少必需的道具
- python - Python中不同维度数组的向量化计算
- macos - 使用 CGDisplayStreamCreate 和 Metal
- c++ - 英特尔 SGX 将 c++ 类/结构作为 void* 传递给 enclave 并将其转换回
- matlab - 将级数求和的计算调整为在求和的每一步除以 n
- .net - 创建 WMI 实例(例如使用 InstrumentationManager.Publish)需要哪些权限?
- arrays - 迭代字典数组以获得最高 gpa