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 - 以自定义类型为参数的突变的主要内容,如果未能解决你的问题,请参考以下文章