调用GraphQL接口成功但async/await方法抛出类型转换异常
问题:GraphQL接口返回成功,但调用时抛出“type int is not a subtype of bool”异常
调用GraphQL端点创建用户,接口返回成功,但调用方法抛出type int is not a subtype of bool异常。
调用代码
await AmplifyInstance()// 此处抛出异常 .createUserOnAzureCosmosDB(user) .then((result) { print(result['data']['userPhoneNumber']); _intlPhoneFieldController.text = (result['data']['userPhoneNumber'].toString()) .substring(1); _incrementStep('continueOnProfilePictureWidget'); });
被调用方法
Future<dynamic> createUserOnAzureCosmosDB(User user) async { HttpLink link = GlobalVariables().graphqlEndpoint; GraphQLClient graphQlClient = GraphQLClient( link: link, cache: GraphQLCache( store: InMemoryStore(), ), ); try { QueryResult mutationResult = await graphQlClient.mutate( //Mutation query here if (mutationResult.data?['createUser'] != null) { print('Created user on Cosmos DB'); registerUserStatus['result'] = true; registerUserStatus['data'] = mutationResult.data?['createUser']; } } on ApiException catch (e) { print('Mutation failed: $e'); registerUserStatus['result'] = false; registerUserStatus['errorMessage'] = e.message; } return registerUserStatus; }
返回对象定义
var registerUserStatus = {};
返回结果打印
I/flutter (14224): result = {result: true, data: {__typename: User, partitionKey: user, userPhoneNumber: 14160000000, userDisplayName: testuser, avatarUrl: www.url.com, createdAt: Today}}
原因分析与解决方案
问题根源
从打印结果能看到,result['data']['userPhoneNumber']是整数类型(14160000000),异常是因为代码中存在把这个整数当作布尔值使用的逻辑,导致类型转换失败。可能的场景:
- 某处直接用
userPhoneNumber做布尔判断(比如if (result['data']['userPhoneNumber'])),Dart会尝试将整数转为布尔值,但如果代码预期的是布尔类型变量,就会抛出类型不匹配异常。 - GraphQL Schema中
userPhoneNumber的类型定义和客户端解析逻辑不匹配,比如后端定义为Int,但客户端模型错误声明为bool类型。
解决方案
- 显式处理类型转换:使用
userPhoneNumber时,先明确转换为字符串或保持整数类型,避免隐式类型判断:// 优化后的代码 var phoneNumber = result['data']['userPhoneNumber']; _intlPhoneFieldController.text = phoneNumber.toString().substring(1); - 排查布尔判断逻辑:搜索所有使用
userPhoneNumber的代码位置,删除或修改把它当作布尔值使用的代码,比如将if (userPhoneNumber)改为if (userPhoneNumber != null)。 - 对齐Schema与客户端模型:确认后端Schema中
userPhoneNumber的类型(应为Int或String),客户端对应模型字段类型要和它保持一致,避免类型解析错误。
内容的提问来源于stack exchange,提问作者Sumchans
相关产品推荐
相关产品推荐

