如何让json_serializable与自定义builder同时运行?
解决自定义Builder与json_serializable共存问题
为啥会出现这情况:
当你的MyCustomType继承自JsonSerializable后,json_serializable的Builder会接手所有带这个父类注解的类,但你的自定义Builder没明确告诉build系统它要监听的是@MyCustomType注解,导致系统默认只触发json_serializable,忽略了你的自定义逻辑。
解决办法:
1. 修改自定义Builder的build.yaml配置
在package:my_custom_type_generator的build.yaml里加上annotations字段,明确指定要处理的自定义注解,让build系统精准触发你的Builder:
builders: extractTypes: import: "package:my_custom_type_generator/builder.dart" builder_factories: ["extractTypes"] build_extensions: {'$lib$': ['extracted-types.json']} build_to: source auto_apply: dependents # 新增:指定自定义注解的路径 annotations: - "package:my_custom_type_annotation/annotation.dart#MyCustomType"
2. 确保Builder代码只监听自定义注解
检查你的builder.dart代码,确保是针对@MyCustomType注解做处理,而不是父类的JsonSerializable。示例核心代码:
Builder extractTypes(BuilderOptions options) => LibraryBuilder( _ExtractTypesGenerator(), ); class _ExtractTypesGenerator extends GeneratorForAnnotation<MyCustomType> { @override String generateForAnnotatedElement( Element element, ConstantReader annotation, BuildStep buildStep) { // 这里写你的类型提取逻辑 return json.encode(/* 生成的JSON数据 */); } }
3. 确认项目依赖配置正确
在custom_type_project的pubspec.yaml里,确保同时引入所需依赖:
dependencies: my_custom_type_annotation: ^x.y.z json_annotation: ^x.y.z dev_dependencies: build_runner: ^x.y.z my_custom_type_generator: ^x.y.z json_serializable: ^x.y.z
4. 强制指定运行所有Builder(可选)
如果上面的配置还不生效,运行build命令时直接指定要执行的两个Builder,确保它们都运行:
flutter pub run build_runner build --builders my_custom_type_generator:extractTypes --builders json_serializable:json_serializable
原理:
通过annotations字段明确自定义Builder的处理目标,避免build系统把带@MyCustomType的类只交给json_serializable。同时代码层面只监听自定义注解,保证不管父类注解是否被处理,自定义逻辑都会触发。
内容的提问来源于stack exchange,提问作者natebot13
相关产品推荐
相关产品推荐

