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
相关产品推荐
相关产品推荐

