使用Drift包多文件编写表与查询遇报错的解决方案咨询
1. 关于Drift文件分离表与查询的可行性
完全可以将表定义和SQL查询都放在drift文件中,不需要必须在Dart代码里编写查询。你的问题出在drift文件的导入方式和循环依赖上。
修复查询文件的表找不到问题
你的local_queries.drift(注意你代码里AuthDao引用的是local_auth_queries.drift,请确保文件名完全一致)错误导入了Dart文件,drift文件之间需要通过相对路径导入其他drift文件来共享表定义:
-- local_auth_queries.drift -- 用相对路径导入定义表的drift文件,示例为同一目录下的情况 import 'create_tables.drift'; saveUser: INSERT INTO Users (id, created_at, first_name, last_name, user_name, email_address) VALUES (:id, :created_at, :first_name, :last_name, :user_name, :email_address);
2. 修复AuthDao的表读取错误
解决循环导入问题
你的local_database.dart导入了auth_queries.dart,而auth_queries.dart又导入了local_database.dart,这会形成循环依赖,导致Drift生成器无法正确处理表与DAO的关联。删掉local_database.dart中的以下导入语句:
import 'package:myapp/global/services/auth_queries.dart';
@DriftDatabase的daos参数仅需DAO类名,无需提前导入,生成器会自动定位到对应的DAO类。
确保表类可访问
Drift会根据create_tables.drift在local_database.g.dart中生成Users表类,你在auth_queries.dart中导入local_database.dart后,就能直接使用Users类——因为part 'local_database.g.dart'会将生成的表类纳入主数据库文件的作用域。
检查文件名一致性
确认AuthDao的@DriftAccessor中include的文件名与实际查询文件名完全匹配,比如你代码里写的是{'local_auth_queries.drift'},但提供的查询文件是local_queries.drift,需统一为同一个文件名。
最后步骤
修改完成后,重新运行Drift生成命令(如dart run build_runner build),生成最新的.g.dart文件,相关错误即可解决。
内容的提问来源于stack exchange,提问作者MKJ

