3

我在颤振渡轮 graphql 包中的自定义序列化程序有一点问题:

我完全使用了渡轮文档中的示例: https ://ferrygraphql.com/docs/custom-scalars/#create-a-custom-serializer

但是在运行 builder_runner 时,我总是收到以下消息:

[SEVERE] built_value_generator:built_value on lib/schema.schema.gql.dart:
Error in BuiltValueGenerator for abstract class GDailyForecastInput implements Built<GDailyForecastInput, dynamic>.
Please make the following changes to use BuiltValue:

1. Make field dateStart have non-dynamic type. If you are already specifying a type, please make sure the type is correctly imported.
2. Make field dateEnd have non-dynamic type. If you are already specifying a type, please make sure the type is correctly imported.
[SEVERE] built_value_generator:built_value on lib/schema.schema.gql.dart:
Error in BuiltValueGenerator for abstract class GHourlyForecastInput implements Built<GHourlyForecastInput, dynamic>.
Please make the following changes to use BuiltValue:

1. Make field dateStart have non-dynamic type. If you are already specifying a type, please make sure the type is correctly imported.
2. Make field dateEnd have non-dynamic type. If you are already specifying a type, please make sure the type is correctly imported.

dateStart 和 dateEnd 是 Date 类型的查询输入值 这是我的类型覆盖: type_overrides: Date: name: Date 有人知道为什么会发生此错误吗?我真的无法找出问题所在

日期在我的 schema.graphql 文件中定义为标量:

"""A date string with format `Y-m-d`, e.g. `2011-05-23`."""
scalar Date

这是我的 build.yaml 文件:

targets:
  $default:
    builders:
      gql_build|schema_builder:
        enabled: true
        options:
          type_overrides:
            Date:
              name: Date
              
      gql_build|ast_builder:
        enabled: true
        options:
          type_overrides:
            Date:
              name: Date

      gql_build|data_builder:
        enabled: true
        options:
          type_overrides:
            Date:
              name: Date
          schema: appdemo|lib/schema.graphql

      gql_build|var_builder:
        enabled: true
        options:
          type_overrides:
            Date:
              name: Date
          schema: appdemo|lib/schema.graphql

      gql_build|serializer_builder:
        enabled: true
        options:
          schema: appdemo|lib/schema.graphql
          custom_serializers:
            - import: './serializers/date_serializer.dart'
              name: DateSerializer

      ferry_generator|req_builder:
        enabled: true
        options:
          type_overrides:
            Date:
              name: Date
          schema: appdemo|lib/schema.graphql

我已经尝试调试了。如果我将我的标量重命名为DateTime一切正常。DateTime(我的文件中也有一个标量schema.graphql。)只有当我使用该名称Date时,才会收到此错误。

我错过了什么吗? 我是否需要在文档中的代码之外创建一个 dartDate类并链接它?

4

1 回答 1

2

确保还包括 data_builder、var_builder 和 req_builder 的 type_overrides。

重要信息 为了简洁起见,我们只包含了上面的 schema_builder,但我们还需要为 data_builder、var_builder 和 req_builder 包含相同的 type_overrides 映射。有关更多详细信息,请参阅完整的 build.yaml 示例。

例如:

假设我有两个自定义标量,一个原始类型和一个非原始类型,

schema.graphql

scalar Date #A datetime string in iso8601.
scalar Metadata #A map with key string and value any.

type Test {
  id: ID!
  date: Date!
  metadata: Metadata!
}

type Query {
  getTest(): Test!
}

date_serializer.dart

import 'package:built_value/serializer.dart';

class DateSerializer implements PrimitiveSerializer<DateTime> {
  @override
  DateTime deserialize(
    Serializers serializers,
    Object serialized, {
    FullType specifiedType = FullType.unspecified,
  }) {
    assert(serialized is String,
        "DateSerializer expected 'String' but got ${serialized.runtimeType}");
    return DateTime.parse(serialized is String ? serialized : "");
  }

  @override
  Object serialize(
    Serializers serializers,
    DateTime date, {
    FullType specifiedType = FullType.unspecified,
  }) =>
      date.toUtc().toIso8601String();

  @override
  Iterable<Type> get types => [DateTime];

  @override
  String get wireName => "Date";
}

metadata_serializer.dart

import "package:gql_code_builder/src/serializers/json_serializer.dart";

class MetadataSerializer extends JsonSerializer<Map<String, dynamic>> {
  @override
  Map<String, dynamic> fromJson(Map<String, dynamic> json) => json;

  @override
  Map<String, dynamic> toJson(Map<String, dynamic> map) => map;
}

build.yaml

targets:
  $default:
    builders:
      gql_build|schema_builder:
        enabled: true
        options:
          type_overrides:
            Metadata:
              name: Map<String, dynamic>
            Date:
              name: DateTime
      gql_build|ast_builder:
        enabled: true

      gql_build|data_builder:
        enabled: true
        options:
          schema: my_project|lib/schema.graphql
          type_overrides:
            Metadata:
              name: Map<String, dynamic>
            Date:
              name: DateTime
      gql_build|var_builder:
        enabled: true
        options:
          schema: my_project|lib/schema.graphql
          type_overrides:
            Metadata:
              name: Map<String, dynamic>
            Date:
              name: DateTime
      gql_build|serializer_builder:
        enabled: true
        options:
          schema: my_project|lib/schema.graphql
          custom_serializers:
            - import: 'path/to/metadata_serializer.dart'
              name: MetadataSerializer
            - import: 'path/to/date_serializer.dart'
              name: DateSerializer

      ferry_generator|req_builder:
        enabled: true
        options:
          schema: my_project|lib/schema.graphql
          type_overrides:
            Metadata:
              name: Map<String, dynamic>
            Date:
              name: DateTime

构建后,您现在应该覆盖两个标量,

test.dart

client.request(request).first.then((response){
  print(response.data?.test.date.runtimeType);
  print(response.data?.test.metadata.runtimeType);
})

output

DateTime
JsLinkedHashMap<String, dynamic>
于 2021-06-25T13:35:28.207 回答