未处理的异常:类型'(dynamic)=>Null不是类型'(String,dynamic)=>的子类型.数据模型中的'f'无效
问题描述:
我收到此错误未处理的异常:type'(dynamic)=>Null不是类型'(String,dynamic)=>的子类型.'f'从API解码json无效",我相信问题可能出在模型中的 Data类,但我不知道如何解决.
I am getting this Error Unhandled Exception: type '(dynamic) => Null' is not a subtype of type '(String, dynamic) => void' of 'f' decoding a json from an API, I believe the problem may be from the Data class in the model but i don't know how to solve it.
模型类
class UserLogin {
bool success;
int statusCode;
String code;
String message;
List<Data> data;
UserLogin({
this.code,
this.success,
this.message,
this.statusCode,
this.data,
});
UserLogin.fromJson(Map<String, dynamic>json){
success = json['success'];
statusCode = json['statusCode'];
code = json['code'];
message = json['message'];
//data = json['data'] != null ? new Data.fromJson(json['data']) : null;
if(json['data'] != null) {
data = new List<Data>();
json['data'].forEach((v){
data.add(new Data.fromJson(v));
});
}
}
Map<String, dynamic> toJson(){
final Map<String, dynamic> data = new Map<String, dynamic>();
data['success'] = this.success;
data['statuCode'] = this.statusCode;
data['code'] = this.code;
data['message'] = this.message;
if(this.data != null) {
data['data'] = this.data.toList();
}
return data;
}
@override toString() => this.toJson().toString();
}
class Data {
String token;
int id;
String email;
String nicename;
String firstname;
String lastname;
String displayName;
Data(
{this.token,
this.id,
this.email,
this.nicename,
this.firstname,
this.lastname,
this.displayName});
Data.fromJson(Map<String, dynamic> json){
token = json['token'];
id = json['id'];
email = json['email'];
nicename = json['nicename'];
firstname = json['firstname'];
displayName = json['displayName'];
}
Map<String, dynamic> toJson(){
final Map<String, dynamic> data = new Map<String, dynamic>();
data['token'] = this.token;
data['id'] = this.id;
data['email'] = this.email;
data['nicename'] = this.nicename;
data['firstname'] = this.firstname;
data['displayName'] = this.displayName;
return data;
}
}
调用api的异步函数
Future<UserLogin> loginCustomer(String username, String password ) async {
//List<UserLogin> model = new List<UserLogin>();
UserLogin model;
try {
var response = await Dio().post(
Config.tokenURL,
data: {
"username" : username,
"password" : password,
},
options: new Options(
headers: {
HttpHeaders.contentTypeHeader: "application/x-www-form-urlencoded",
},
),
);
if(response.statusCode == 200) {
print(response.data);
model = UserLogin.fromJson(response.data);
}
} on DioError catch (e) {
print(e.message);
}
return model;
}
来自Api的回复
{success: true, statusCode: 200, code: jwt_auth_valid_credential, message: Credential is valid, data: {token:***, id: 1, email: ***, nicename: ***, firstName: ***, lastName: ***, displayName: ****}}
更新代码
class UserLogin {
bool success;
int statusCode;
String code;
String message;
Data data;
UserLogin({
this.code,
this.success,
this.message,
this.statusCode,
this.data,
});
UserLogin.fromJson(Map<String, dynamic>json){
success = json['success'];
statusCode = json['statusCode'];
code = json['code'];
message = json['message'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
}
Map<String, dynamic> toJson(){
final Map<String, dynamic> data = new Map<String, dynamic>();
data['success'] = this.success;
data['statuCode'] = this.statusCode;
data['code'] = this.code;
data['message'] = this.message;
if(this.data != null) {
data['data'] = this.data.toJson();
}
return data;
}
@override toString() => this.toJson().toString();
}
class Data {
String token;
int id;
String email;
String nicename;
String firstname;
String lastname;
String displayName;
Data(
{this.token,
this.id,
this.email,
this.nicename,
this.firstname,
this.lastname,
this.displayName});
Data.fromJson(Map<String, dynamic> json){
token = json['token'];
id = json['id'];
email = json['email'];
nicename = json['nicename'];
firstname = json['firstname'];
displayName = json['displayName'];
}
Map<String, dynamic> toJson(){
final Map<String, dynamic> data = new Map<String, dynamic>();
data['token'] = this.token;
data['id'] = this.id;
data['email'] = this.email;
data['nicename'] = this.nicename;
data['firstname'] = this.firstname;
data['displayName'] = this.displayName;
return data;
}
}
答
基于 response.data
,您的数据是 object
,但您将其定义为 UserLogin 模型类中的code> List ,这是错误的.
Based on the response.data
, your data is an object
, but you defined it as List
in UserLogin
model class, which is wrong.
正确的应该是数据数据
;