You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:45:00