使用Isar创建Collection遇构造参数错误及.g文件未生成求助
Isar与Freezed结合时构造参数不匹配问题的解决方法
问题场景
尝试创建结合Freezed的Isar Collection,代码如下:
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:isar/isar.dart'; part 'model.freezed.dart'; part 'model.g.dart'; @freezed @Collection(ignore: {'copyWith'}, inheritance: false) class Model with _$Model { const factory Model({ required String address, }) = _Model; Id get id => Isar.autoIncrement; const Model._(); }
执行命令 flutter pub run build_runner build --delete-conflicting-outputs 时出现错误:
Constructor parameter does not match a property. | | required String address, |
Freezed文件正常生成,但Isar对应的.g.文件未创建。
解决方案
1. 修正代码结构
核心问题是Isar默认未开启继承扫描,无法识别Freezed生成的子类属性,同时Id字段的定义不符合Isar要求。修正后的代码如下:
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:isar/isar.dart'; part 'model.freezed.dart'; part 'model.g.dart'; @freezed @Collection(inheritance: true, ignore: {'copyWith'}) class Model with _$Model { const factory Model({ required String address, @Id() Id? id, }) = _Model; const Model._(); Id get id => id ?? Isar.autoIncrement; }
2. 关键修改说明
- 将
@Collection注解的inheritance设为true:让Isar扫描Freezed生成的_Model子类属性,解决address参数无法匹配属性的问题。 - 把
id作为可选参数加入factory构造,并用@Id()注解标记:配合getter实现Id自动递增的同时,让Isar正确识别主键字段。
3. 确保依赖配置正确
检查pubspec.yaml中是否包含所需依赖:
dependencies: isar: ^3.1.0+1 isar_flutter_libs: ^3.1.0+1 freezed_annotation: ^2.4.1 dev_dependencies: build_runner: ^2.4.6 isar_generator: ^3.1.0+1 freezed: ^2.4.1
4. 重新执行构建命令
再次运行:
flutter pub run build_runner build --delete-conflicting-outputs
此时Freezed和Isar的生成文件都会正常创建。
内容的提问来源于stack exchange,提问作者sub
相关产品推荐
相关产品推荐

