我使用Drift(Moor(v2.0.2+1库作为本地数据库,并使用json_serializable v6.3.1库来序列化我的数据模型。然后,我使用build_runner v2.2.0库为这两个版本生成样板代码。
我有一个数据库表,叫做乘客表。当运行build_runner时,它为表生成DataClass,如下所示:
class PassengerTableData extends DataClass implements Insertable<PassengerTableData> {
final int? id;
final String? firstName;
final String? lastName;
.......
}
我想使用这个DataClass类作为API调用的响应对象。所以,我添加了一个这样的数据模型:
@JsonSerializable(explicitToJson: true)
class CreatePassengerRequest {
List<PassengerTableData?>? passengers;
CreatePassengerRequest(this.passengers);
factory CreatePassengerRequest.fromJson(Map<String, dynamic> json) => _$CreatePassengerRequestFromJson(json);
Map<String, dynamic> toJson() => _$CreatePassengerRequestToJson(this);
}
当运行build_runner时,它也会为该模型生成序列化代码,但它无法为DataClass生成正确的代码,只能将动态代码放在它的位置。结果如下:
CreatePassengerRequest _$CreatePassengerRequestFromJson(Map<String, dynamic> json)
=>CreatePassengerRequest(json['passengers'] as List<dynamic>?); // <--- here
既然build_runner正在为这两个库生成代码,那么在为模型生成序列化代码时,是否还没有生成DataClass?是否可以";冻结";一些文件在运行buildrunner时无法重建,或者更改buildrunner处理文件的顺序?
我尝试使用build_config库,但无法使其正常工作。
我能够让它工作,但使用了一个";hack";。
我可以通过在build.yaml文件中使用runs_before和required_inputs来更改构建顺序,但它仍然给出相同的错误。这是因为每次运行build_runner时,生成的数据库文件都会被删除(并重新生成(。即使我在build.yaml中为drift_dev设置了enabled:false,该文件也被删除了。
因此,我首先运行build_runner,并确保所有数据库表的代码都正确生成。然后,我将生成的数据库文件(例如:database.g.dart(重命名为databaseg.dart,然后再次运行build_runner。这一次,为数据库生成的文件没有被删除,因此json_serializable和retrofit_generator可以访问文件中的DataClass对象。因此,没有更多的错误!