【问题标题】:Flutter / GraphQL - Mutation with custom type as parameterFlutter / GraphQL - 以自定义类型为参数的突变
【发布时间】:2019-05-14 23:36:45
【问题描述】:

我是 Flutter 和 graphQL 的新手,目前我正在将突变集成到我的应用程序中。所以,我有服务器端使用模式中定义的一些自定义类型,但我不知道如何在颤振端指定它们。让我们看一些代码:

input DiaryGroupPermission {
  groupId: Int!
  permission: Int!
}

input DiaryInsideCommunity {
  communityId: Int!
  permissions: [DiaryGroupPermission]!
}

createDiary(community: DiaryInsideCommunity, description: String, title: String!): Diary

但在客户端上,我不知道如何在突变中指定 DiaryInsideCommunity。 我尝试过这样的事情:

String createDiary = """
  mutation CreateDiary(\$title: String!, \$description: String!, \$community: DiaryInsideCommunity) {
    createDiary(
    title: \$title,
    description: \$description,
    community: \$community
  ) {
    id
  }
)}""".replaceAll('\n', ' ');

并按如下方式传递我的 runMutation:

runMutation({
            "title": _generalPage.title(),
            "description": _generalPage.description(),
            "community": {
              "communityId": 1,
              "permissions": _permissionPage.selectedGroups().map((group) {
                return {
                  "groupId": group.id,
                  "permission": 1,
                };
              }).toList(),
            }
          });

有什么想法吗?在谷歌上找不到任何东西。

【问题讨论】:

    标签: dart flutter graphql


    【解决方案1】:

    假设您使用的是graphql_flutter, 您可以在变量中指定它 一个例子是说你有这个突变的定义

     type Mutation {
     createMeterReading(
      createMeterReadingInput: CreateMeterReadingInput
     ): MeterReading }
    

    你的输入类型定义

         input CreateMeterReadingInput {
               reading: Float
               companyId: Int
               companyStaffId: Int
               customerId: Int
               readingDataType: String
               latitude: Float
               longitude: Float
               masterMeterId: Int
               analogMeterId: Int
               type: String
               editedStatus: String
               base64Image: String
               readingTime: String
         }
    

    在flutter中有

     final response = await client.value.mutate(MutationOptions(
      variables: {
        'createMeterReadingInput': {
          'reading': double.parse(_meterReadingController.text),
          'companyStaffId': _decodedToken["companyStaffId"],
          'analogMeterId': waterMeter["analogMeterId"],
          'type': "actual",
          'base64Image': getBase64(),
          'readingTime': timeNow,
          'latitude': widget?.currentPosition?.latitude,
          'longitude': widget?.currentPosition?.longitude
        }
      },
      documentNode: gql(r"""
    mutation createMeterReading($createMeterReadingInput:CreateMeterReadingInput  ) {
      createMeterReading(createMeterReadingInput: $createMeterReadingInput) {
     meterReadingId
    reading
    companyId
    companyStaffId
    imageUrl
    editedStatus
    companyStaff{
      firstName
    }
    }
    }
    
    
    """),
    ));
    

    【讨论】:

    • 你用 dgraph/slash graphQL 试过了吗?那里的突变对我不起作用
    【解决方案2】:

    很高兴看到围绕 graphql_flutter 库创建的社区。​​p>

    class DiaryGroupPermission {
      int groupId;
      int permission;
    
      DiaryGroupPermission.fromJson(Map json)
          : groupId = json['groupId'],
            permission = json['permission'];
    }
    
    class DiaryInsideCommunity {
      int communityId;
      List<DiaryGroupPermission> permissions;
    
      DiaryInsideCommunity.fromJson(Map json)
          : communityId = json['communityId'],
            permissions = json['permissions']
                .map<DiaryGroupPermission>((Map permisionJson) =>
                    DiaryGroupPermission.fromJson(permisionJson))
                .toList();
    }
    
    class Diary {
      String body;
    
      Diary(dynamic value) : body = value.toString();
    }
    
    typedef Diary createDiaryFunction(
        DiaryInsideCommunity community, String description, String title);
    
    DiaryInsideCommunity community = DiaryInsideCommunity.fromJson({
      'communityId': 1,
      'permissions': [
        {'groupId': 1, 'permission': 1}
      ]
    });
    
    Diary mutation(DiaryInsideCommunity community,
            {String description, @required String title}) =>
        Diary(community.permissions[0].groupId);
    
    Diary mutationResult = mutation(community, description: "a", title: "b");
    

    我在 dart 中实现了您想要的类型,并创建了一个模型变异函数来向您展示如何调用它。

    在 dart 中没有更简单的方法来做类型。

    为这个库的创建者干杯,

    欧盟

    【讨论】:

    • 真的有用吗? DiaryInsideCommunity不应该在客户端的gql中定义吗?
    猜你喜欢
    • 2017-09-18
    • 1970-01-01
    • 2018-02-22
    • 2020-11-19
    • 2019-10-19
    • 2020-07-13
    • 1970-01-01
    • 2021-11-21
    • 2020-09-22
    相关资源
    最近更新 更多