如何在Flutter中对Stream<List<Jobs>>按作业类型过滤?
解决方案
方法1:在现有Stream上过滤数据
如果你的streamController中发送的是全量Jobs列表,可通过map操作符对列表做过滤,返回符合transType条件的子列表:
Stream<List<Jobs>> populateJobs(String jType) { return streamController.stream.map((jobsList) { return jobsList.where((job) => job.transType == jType).toList(); }); }
补充说明
map操作符会把Stream中的每个List<Jobs>转换为过滤后的新列表- 若需要模糊匹配(比如
transType包含指定字符串),可修改判断逻辑:return jobsList.where((job) => job.transType.contains(jType)).toList();
方法2:直接用ObjectBox生成过滤后的Stream(更高效)
先全量获取再过滤的方式存在性能浪费,更优的做法是让ObjectBox在查询阶段就完成过滤,直接返回符合条件的流式结果:
// 假设你已初始化ObjectBox的Box<Jobs>实例,命名为jobsBox Stream<List<Jobs>> populateJobs(String jType) { return jobsBox.query(Jobs_.transType.equals(jType)) .watch(triggerImmediately: true) .map((query) => query.find()); }
补充说明
Jobs_.transType是ObjectBox自动生成的实体属性引用,用于构建查询条件watch(triggerImmediately: true)会返回一个实时更新的Stream,当数据库中符合条件的数据变化时,Stream会自动推送新结果- 若需模糊匹配,可将查询条件改为
contains:return jobsBox.query(Jobs_.transType.contains(jType)) .watch(triggerImmediately: true) .map((query) => query.find());
内容的提问来源于stack exchange,提问作者xdev
相关产品推荐
相关产品推荐

