Flutter调用API获取用户列表报List<Result>?类型不匹配错误
问题原因
你遇到的The argument type 'List<Result>?' can't be assigned to the parameter type 'List<Result>'报错和页面无法渲染问题,是4个代码逻辑错误共同导致的:
- 空安全类型不匹配:
UserModel中result定义为非空List<Result>,但fromJson方法中当json["result"]为null时会返回null值,给非空字段传可空值直接触发类型错误。 - JSON结构解析逻辑错误:你的接口返回的是单个外层对象(包含status和result数组),不是
UserModel数组,但ApiService里定义返回Future<List<UserModel>>,结构完全不匹配。 - 序列化方法位置错误:你把
userModelFromJson、userModelToJson两个序列化方法写在了Result类内部,作用域错误无法正常调用。 - 非空字段赋值冲突:
docentId、naam等字段标记了required非空,但fromJson里判空后会给这些字段传null,非空字段接收null值会直接触发运行时崩溃。
修复方案
1. 修正实体类代码,对齐空安全类型
把序列化方法移到顶层,所有非空字段增加默认值兜底,保证类型匹配:
import 'dart:convert'; // 序列化方法移到类外部作为顶层函数 UserModel userModelFromJson(String str) => UserModel.fromJson(json.decode(str)); String userModelToJson(UserModel data) => json.encode(data.toJson()); class UserModel { UserModel({ required this.status, required this.result, }); int status; List<Result> result; factory UserModel.fromJson(Map<String, dynamic> json) => UserModel( status: json["status"] ?? 0, // null场景返回空数组,保证类型为非空List<Result> result: json["result"] == null ? [] : List<Result>.from(json["result"].map((x) => Result.fromJson(x))), ); Map<String, dynamic> toJson() => { "status": status, "result": List<dynamic>.from(result.map((x) => x.toJson())), }; } class Result { Result({ required this.docentId, required this.naam, required this.achternaam, required this.emailadres, required this.geboortedatum, required this.geboorteplaats, this.maxRijafstand, this.heeftRijbewijs, this.heeftAuto, required this.straat, required this.huisnummer, required this.geslacht, required this.nationaliteit, required this.woonplaats, required this.postcode, required this.land, required this.wachtwoord, required this.isAccepted, this.isFlexwerker, }); int docentId; String naam; String achternaam; String emailadres; String geboortedatum; String geboorteplaats; dynamic maxRijafstand; dynamic heeftRijbewijs; dynamic heeftAuto; String straat; int huisnummer; String geslacht; String nationaliteit; String woonplaats; String postcode; String land; String wachtwoord; int isAccepted; dynamic isFlexwerker; factory Result.fromJson(Map<String, dynamic> json) => Result( // 所有非空字段加默认值兜底,禁止传null docentId: json["docentID"] ?? 0, naam: json["naam"] ?? "", achternaam: json["achternaam"] ?? "", emailadres: json["emailadres"] ?? "", geboortedatum: json["geboortedatum"] ?? "", geboorteplaats: json["geboorteplaats"] ?? "", maxRijafstand: json["maxRijafstand"], heeftRijbewijs: json["heeftRijbewijs"], heeftAuto: json["heeftAuto"], straat: json["straat"] ?? "", huisnummer: json["huisnummer"] ?? 0, geslacht: json["geslacht"] ?? "", nationaliteit: json["nationaliteit"] ?? "", woonplaats: json["woonplaats"] ?? "", postcode: json["postcode"] ?? "", land: json["land"] ?? "", wachtwoord: json["wachtwoord"] ?? "", isAccepted: json["isAccepted"] ?? 0, isFlexwerker: json["isFlexwerker"], ); Map<String, dynamic> toJson() => { "docentID": docentId, "naam": naam, "achternaam": achternaam, "emailadres": emailadres, "geboortedatum": geboortedatum, "geboorteplaats": geboorteplaats, "maxRijafstand": maxRijafstand, "heeftRijbewijs": heeftRijbewijs, "heeftAuto": heeftAuto, "straat": straat, "huisnummer": huisnummer, "geslacht": geslacht, "nationaliteit": nationaliteit, "woonplaats": woonplaats, "postcode": postcode, "land": land, "wachtwoord": wachtwoord, "isAccepted": isAccepted, "isFlexwerker": isFlexwerker, }; }
2. 修正ApiService解析逻辑
接口返回的用户列表存在外层UserModel的result字段里,直接返回该列表即可,同时增加异常兜底避免页面崩溃:
class ApiService { Future<List<Result>> getUsers() async { try { var url = Uri.parse(apis.baseUrl + apis.getUsers); var response = await http.get(url); if (response.statusCode == 200) { UserModel model = userModelFromJson(response.body); return model.result; } return []; } catch (e) { log(e.toString()); return []; } } }
注意事项
- Dart空安全规则下,非空类型的字段绝对不能接收可空值,要么把字段改为可空类型(类型后加
?),要么给null场景配置默认兜底值。 - 写JSON解析逻辑前先梳理清楚接口返回结构,外层是对象就先解析对象,不要直接把整个响应当成列表解析。
- 顶层工具函数不要写在实体类内部,会导致作用域异常无法调用。
内容的提问来源于stack exchange,提问作者Anne van den Bosch
相关产品推荐
相关产品推荐

