如何在ObjectBox查询中传递参数并结合Stream使用?
ObjectBox 带参数过滤的Stream查询实现
你的错误在于过滤条件的位置和调用方式完全错误:ObjectBox的查询条件必须在query()方法中直接传入,而不是在watch()之后的map里修改Query对象,而且Query也没有param这个方法。
1. 固定参数过滤(比如固定查询6月数据)
直接在query()中传入过滤条件,然后监听查询结果的Stream:
late Stream<List<Income>> _stream; _stream = _Mystore .box<Income>() // 在这里传入过滤条件:匹配monthNumber等于6的记录 .query(Income_.monthNumber.equals(6)) .watch(triggerImmediately: true) .map((querySnapshot) => querySnapshot.find());
2. 动态参数过滤(支持切换过滤条件)
如果需要根据外部参数动态调整过滤规则,可以封装成方法,甚至结合ValueNotifier实现参数变化时自动更新Stream:
第一步:封装过滤Stream的方法
Stream<List<Income>> getIncomeStreamByMonth(int targetMonth) { return _Mystore .box<Income>() .query(Income_.monthNumber.equals(targetMonth)) .watch(triggerImmediately: true) .map((snapshot) => snapshot.find()); }
第二步:动态切换参数(比如用户选择不同月份)
用ValueNotifier监听参数变化,通过switchMap自动切换Stream:
// 保存当前要过滤的月份,初始值设为6 final ValueNotifier<int> currentMonth = ValueNotifier(6); // 监听月份变化,自动切换过滤Stream late Stream<List<Income>> _stream = currentMonth.stream .switchMap((month) => getIncomeStreamByMonth(month)); // 当需要切换月份时,直接更新ValueNotifier的值即可 // currentMonth.value = 7;
3. 修正StreamBuilder的类型安全
把StreamBuilder<List<dynamic>>改成StreamBuilder<List<Income>>,避免不必要的强制转换:
return StreamBuilder<List<Income>>( stream: _stream, builder: (context, snapshot) { final activeIncomes = snapshot.data; if (!snapshot.hasData || activeIncomes!.isEmpty) { return Align( alignment: Alignment.center, child: noData(), ); } return itemList(activeIncomes); }, );
错误原因说明
你之前写的query.param.(Income_.monthNumber.equals(6))find()是完全错误的用法:
- ObjectBox的Query对象没有
param方法 - 过滤条件必须在创建Query(即调用
box.query(...))时传入,watch返回的是Query的快照,无法修改已有的查询条件
内容的提问来源于stack exchange,提问作者yoohoo
相关产品推荐
相关产品推荐

