You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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类型。

解决方案

  1. 显式处理类型转换:使用userPhoneNumber时,先明确转换为字符串或保持整数类型,避免隐式类型判断:
    // 优化后的代码
    var phoneNumber = result['data']['userPhoneNumber'];
    _intlPhoneFieldController.text = phoneNumber.toString().substring(1);
    
  2. 排查布尔判断逻辑:搜索所有使用userPhoneNumber的代码位置,删除或修改把它当作布尔值使用的代码,比如将if (userPhoneNumber)改为if (userPhoneNumber != null)。
  3. 对齐Schema与客户端模型:确认后端Schema中userPhoneNumber的类型(应为Int或String),客户端对应模型字段类型要和它保持一致,避免类型解析错误。

内容的提问来源于stack exchange,提问作者Sumchans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:50:17