You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 03:57:29