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

无法使用is运算符校验服务器返回数据是否为UserTest类型的问题求助

问题根源分析

你遇到的核心问题很清晰:服务器返回的JSON数据解析后是Map<String, dynamic>类型的普通对象,并不是你定义的UserTest类的实例,所以response is UserTest这个判断永远不会触发——哪怕Map里包含了UserTest的所有字段,它的运行时类型依然是Map,和UserTest没有任何实例关系。

解决方案

你不需要用is来做类型判断,正确的思路是:确认返回数据是合法Map后,直接调用UserTest.fromJson将其转换为UserTest实例,同时增加异常处理来应对数据格式不符的情况。

修改后的loginApp函数示例:

Future<Object> loginApp() async {
  try {
    final Map<String, dynamic> dataForm = {
      "name": "eve.holt@reqres.in",
      "job": "123456",
    };
    var bodyJson = json.encode(dataForm);
    print("bodyJson $bodyJson");
    
    var response = await _apiNetworkPOST(endPoint: 'users', body: bodyJson);
    
    // 先确认返回的是Map类型
    if (response is Map<String, dynamic>) {
      print("Received Map data: $response");
      try {
        // 直接转换为UserTest实例
        UserTest user = UserTest.fromJson(response);
        return user;
      } catch (e) {
        // 处理转换失败的情况(比如DateTime解析错误、字段缺失等)
        return ErrorJson(message: "Failed to parse UserTest: ${e.toString()}");
      }
    } else {
      // 处理非Map类型的异常返回
      return ErrorJson(message: "Unexpected response type: ${response.runtimeType}");
    }
  } on Exception catch (e) {
    return FetchDataException(e.toString());
  }
}
进阶优化(可选)

如果希望简化后续调用,可以封装请求函数,让它内部直接完成解析并返回UserTest类型:

Future<UserTest> _apiPostUser({required String endPoint, required String body}) async {
  var response = await _apiNetworkPOST(endPoint: endPoint, body: body);
  if (response is Map<String, dynamic>) {
    return UserTest.fromJson(response);
  }
  throw Exception("Invalid response format for UserTest");
}

这样后续调用时,就能直接拿到UserTest实例,不用再手动处理类型判断和转换逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 15:47:29