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

Flutter Drift查询使用where语句时触发类型不匹配异常求助

Flutter Drift Where语句类型不匹配异常排查方案

问题现象

执行带where条件的Drift查询时抛出类型转换异常:

Unhandled Exception: type '(dynamic) => dynamic' is not a subtype of type '(HasResultSet) => Expression' of 'filter'

异常触发代码:

Future<dynamic> getById(int id) async {
  return await (db.select(table)..where((tbl) => tbl.id.equals(id))).getSingle();
}

移除where并添加limit后可正常运行:

Future<dynamic> getById(int id) async {
  return await (db.select(table)..limit(1)).getSingle();
}

排查与解决步骤

  • 明确表与字段的强类型定义
    确保table是Drift生成的具体表类实例(而非dynamic类型),id字段已正确声明为IntColumn类型。避免将表实例赋值给动态变量,必须指定具体类型(如UserTable table)。

  • 替换动态返回类型
    不要使用Future<dynamic>作为返回值,改为对应的数据实体类型(如Future<User>)。强类型返回值能帮助Drift正确推导回调参数类型,避免动态类型导致的类型模糊。
    修正示例:

    Future<User> getById(int id) async {
      return await (db.select(userTable)..where((tbl) => tbl.id.equals(id))).getSingle();
    }
    
  • 重新生成Drift代码
    执行flutter pub run build_runner build重新生成drift代码,确保生成的表类包含正确的字段方法(equals方法应返回Expression<bool>类型)。若之前代码生成不完整,可能导致类型匹配失败。

  • 显式指定回调参数类型
    在where回调中显式声明参数类型,消除隐式动态类型推导的问题:

    ..where((UserTable tbl) => tbl.id.equals(id))
    

内容的提问来源于stack exchange,提问作者Iker Vázquez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:45:28