无法使用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
相关产品推荐
相关产品推荐

