Dart中Drift ORM查询构建:Expression<bool>与bool类型兼容问题
解决Drift ORM中bool与Expression类型不兼容的查询问题
问题原因
Drift的where方法要求传入的条件是Expression<bool>类型(Drift定义的表达式类型),而你代码中的yesterday、tomorrow是Dart原生bool类型,两者无法直接用&、|进行逻辑运算,因此触发类型错误。
解决方案
这里提供两种可行的解决方式:
方式一:用Constant()包装原生bool
将原生bool变量通过Drift的Constant()方法转换为Expression<bool>,这样就能和其他日期表达式进行逻辑运算:
query.where((c) => (c.date.isSmallerThan(DateTime.now()) & Constant(yesterday)) | (c.date.isGreaterThan(DateTime.now()) & Constant(tomorrow)) );
注意:你代码中的
isSmallerlValue、isGreaterValue是拼写错误,Drift中对应的日期比较方法是isSmallerThan和isGreaterThan。
方式二:动态构建查询条件列表
如果需要更清晰的逻辑控制,可以根据bool变量的值动态添加对应的查询条件,最后用joinOr()组合多个条件:
final now = DateTime.now(); // 取今日0点,确保筛选昨日数据的准确性(避免包含今日的部分时间) final todayStart = DateTime(now.year, now.month, now.day); query.where((c) { final conditions = <Expression<bool>>[]; if (yesterday) { // 筛选昨日及之前,若需严格匹配昨日可改为c.date.isBetween(...) conditions.add(c.date.isSmallerThan(todayStart)); } if (tomorrow) { // 筛选明日及之后,严格匹配明日可改为c.date.isBetween(...) conditions.add(c.date.isGreaterThan(todayStart.add(const Duration(days: 1)))); } // 无筛选条件时返回true(即查询全部数据),否则用OR连接所有条件 return conditions.isEmpty ? const Constant(true) : conditions.joinOr(); });
这种方式逻辑更直观,还能避免bool变量为false时产生无效的逻辑分支。
内容的提问来源于stack exchange,提问作者Jaczura Zoltán
相关产品推荐
相关产品推荐

