Flutter调用Laravel后端获取用户简介时类型不匹配报错排查
问题解决:Flutter类型不匹配错误(_Map<String, dynamic> 不是 String? 的子类型)
错误根源
报错指向BaseResponseEntity.fromJson方法,原因是后端返回的data字段是Map结构({"description": "just a test description"}),但你的BaseResponseEntity类中data属性被定义为String?类型,导致类型转换失败。
解决方案
方案1:修改BaseResponseEntity的data类型
将data的类型改为Map<String, dynamic>?或自定义实体类,适配后端返回格式。
方式一:直接用Map接收数据
修改BaseResponseEntity类定义:
class BaseResponseEntity { final int? code; final String? msg; final Map<String, dynamic>? data; // 改为Map类型 BaseResponseEntity({this.code, this.msg, this.data}); factory BaseResponseEntity.fromJson(Map<String, dynamic> json) => BaseResponseEntity( code: json["code"], msg: json["msg"], data: json["data"], ); Map<String, dynamic> toJson() => { "counts": code, "msg": msg, "items": data, }; }
方式二:自定义实体类接收(更规范)
先定义ProfileData实体类:
class ProfileData { final String? description; ProfileData({this.description}); factory ProfileData.fromJson(Map<String, dynamic> json) => ProfileData( description: json["description"], ); }
再修改BaseResponseEntity:
class BaseResponseEntity { final int? code; final String? msg; final ProfileData? data; // 改为自定义实体类型 BaseResponseEntity({this.code, this.msg, this.data}); factory BaseResponseEntity.fromJson(Map<String, dynamic> json) => BaseResponseEntity( code: json["code"], msg: json["msg"], data: json["data"] != null ? ProfileData.fromJson(json["data"]) : null, ); Map<String, dynamic> toJson() => { "counts": code, "msg": msg, "items": data?.toJson(), }; }
方案2:调整后端返回格式(可选)
如果希望data返回纯字符串,修改Laravel接口直接返回description字段值:
public function get_profile_description(Request $request){ $token = $request->token; $res = DB::table("users")->select("description")->where("token","=",$token)->first(); return ["code" => 0, "data" => $res->description ?? "", "msg" => "success"]; }
这种情况下BaseResponseEntity的data可保持String?类型。
验证
修改完成后重新调用接口,即可正常解析返回数据,不会再出现类型不匹配错误。
内容的提问来源于stack exchange,提问作者Aziz Sdiri
相关产品推荐
相关产品推荐

