Flutter / GraphQL - 以自定义类型为参数的突变

Posted

技术标签:

【中文标题】Flutter / GraphQL - 以自定义类型为参数的突变【英文标题】:Flutter / GraphQL - Mutation with custom type as parameter 【发布时间】: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(),
            
          );

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

【问题讨论】:

【参考方案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中定义吗?

以上是关于Flutter / GraphQL - 以自定义类型为参数的突变的主要内容,如果未能解决你的问题,请参考以下文章

Flutter中如何自定义状态栏?

Amplify Flutter:如何连接到现有的 GraphQL 端点

在打字稿中以自引用方式键入对象

Flutter - GraphQL 支持

实现 GraphQL 和 Flutter

数据库多条记录抽取共性,特性以自定义符号分隔形成一条记录