在你说这是一个重复的问题或者我应该使用嵌套流生成器之前,请听我说完。
我正在设计一个社交媒体类型的应用程序。我希望用户在关注其“我的追随者帖子”集合中的帖子时能够收到更新。在该应用程序中,该应用程序将检查firebase rtdb中当前用户的以下列表(他正在跟踪的人),并列出他们的UID。
我计划使用所述列表创建一个流列表(当然是按时间排序的),并将它们合并到一个流中,然后将其输入到私有提要页面上的流生成器中。
在此页面上,用户将能够轻松关注他们感兴趣的人发布的内容。
我认为这样一个系统比每个在“私人订阅源”集合中拥有文档的用户都更具成本效益,每当有人发布内容时,应用程序都会读取他们的关注者列表,然后迅速在他们的每个私人订阅源中发布更新。因为想象一个拥有200万粉丝的人。这意味着200万次即时写作。后来,200万人阅读。我认为,海报只需将帖子放在他们的“publicFeed”中,而不同的关注者只需收听该feed并与他们保持联系,这样会更具成本效益。
但是这需要实现多个流(多于2个)的合并。我该怎么做?
我尝试过阅读RxDart,但对我来说完全是希腊语。我相对来说是飞镖的初学者。我只编码了大约5个月。
我最近遇到了一个类似的情况,我建议您这样做(我正在使用cloud firestore,但我相信您已经编写了流,所以重要的部分是使用多个流):
您必须将此插件添加到pub spec.yaml中:https://pub.dev/packages/rxdart
以下是存储库(在您的帖子中,比如newPosts、oldPosts):
class PostRepository {
static CollectionReference get collection => yourCollectionRef;
static Stream<List<Post>> newPosts() {
Query query = collection
.where('Your condition like was viewed', isEqualTo: false)
.orderBy('updateDate', descending: true)
.limit(50);
return query.snapshots().map<List<Post>>((querySnapshot) {
final _newPosts = querySnapshot.documents.map((doc) {
final post = Post.fromDoc(doc);
return post;
}).where((p) => p != null);
return _newPosts
});
}
static Stream<List<Post>> oldPosts() {
Query query = collection
.where('Your condition like was viewed', isEqualTo: true)
.orderBy('updateDate', descending: true)
.limit(50);
return query.snapshots().map<List<Post>>((querySnapshot) {
final _oldPosts = querySnapshot.documents.map((doc) {
final post = Post.fromDoc(doc);
return post;
}).where((p) => p != null);
return _oldPosts
});
}
}
然后,要获得多个流(以上两个流的组合),请在您的widget类中执行以下操作:
重要!您必须导入此-导入“包:rxdart/streams.dart”;
List<Post> newPosts;
List<Post> oldPosts;
Widget _pageContent() {
return SingleChildScrollView(
child: Column(
children: [
ListView.builder(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemCount: newPosts.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(newPosts[index].title)
);
}
),
ListView.builder(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemCount: oldPosts.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(oldPosts[index].title)
);
}
)
]
)
);
}
Widget _posts() {
return StreamBuilder(
stream: CombineLatestStream.list([
PostRepository.getNewPosts(),
PostRepository.getOldPosts()
]),
builder: (context, snap) {
if (snap.hasError) {
debugPrint('${snap.error}');
return ErrorContent(snap.error);
} else if (!snap.hasData) {
return Center(
child: CircularProgressIndicator(),
);
}
newPosts = snap.data[0];
oldPosts = snap.data[1];
return _pageContent();
}
);
}
我像是从头开始写代码的,所以可能会有一些小错误,但我希望你明白这一点,享受吧:)
您可以使用异步包中的StreamGroup:https://pub.dev/documentation/async/latest/async/StreamGroup-class.html将多个流中的事件分组-dart团队对其进行了充分的记录和维护。如果您没有RxDart经验,这是一个不错的选择。它没有rx的所有功能,但对于初学者来说,应该更容易理解这一点
操作步骤: ①在"图层管理"模块,选择图层,点击"更多"按钮。 ②点击"复制数据密钥"按钮。 ③弹出"复制数据密钥窗口",点击"复制"按钮。 ④进入想要合并的地图,点击地图右上工具条上的"数据密钥"按钮。 ⑤弹出"导入数据密钥窗口",粘贴刚才复制的密钥,点击"导入"按钮,数据在地图导入成功。 提示: ●复制图层数据参考复制拷贝图层 操作动图: [查看原图]
从flink办公室引入会话窗口 https://ci.apache.org/projects/flink/flink-docs-stable/dev/stream/operators/windows.html#session-窗口。。。会话窗口操作符为每个到达的记录创建一个新窗口,如果窗口之间的距离比定义的间隙更近,则将窗口合并在一起。为了可合并,会话窗口操作符需要合并触发器和合并窗口函数,。。。
问题内容: 我正在使用’Lucene.Net’库,并且有以下问题。 不是创建两个单独的QueryParser对象并使用它们来获得两个Hits对象,而是可以使用一个QueryParser对象在两个字段上进行搜索,这样我只有一个Hits对象,它可以为我提供每个文档的总体得分? 问题答案: 有3种方法可以做到这一点。 第一种方法是手动构造查询,这是QueryParser内部的工作。这是执行此操作最强大的
问题内容: 供参考的是代码。我正在尝试制作一个记录到elasticsearch的hubot插件,然后使用hubot命令搜索那些日志。 https://gist.github.com/4050748 我正在尝试检索与两个查询匹配的记录。 我期待: 多达50条记录 具有给定用户的记录 最近一小时的记录 我有: 最多10条记录 具有给定用户的记录 从任何时候 我如何在过去一小时内获取带有某些用户名的所有
问题内容: 如何合并两个保持BST属性的二叉搜索树? 如果我们决定从一棵树中取出每个元素并将其插入到另一个元素中,则此方法的复杂度将为,其中是我们已拆分的树的节点数(例如),是的结点数。另一棵树(例如)。此操作后,只有一个具有节点。 我的问题是:我们能做得比好吗? 问题答案: 纳夫的答案还有更多细节: 将BST展平为排序列表为O(N) 它只是整个树上的“有序”迭代。 两者都做O(n1 + n2)
问题内容: 如何将其写成一行? 用id和class选择html标签的方法是什么? 问题答案: 您所要做的就是用逗号分隔它们,例如