flutter http post请求返回Null



我试图在我的flutter应用程序中对用户进行身份验证,但我一直得到空响应。下面是登录功能。

Future<ApiResponse> login(String email, String password) async {
ApiResponse apiResponse = ApiResponse();
try {
// This response variable returns null;
final response = await http.post(
Uri.parse(projectApis.loginUrl),
body: json.encode({"email": email, "password": password}),
headers: projectApis.headers,
);
switch (response.statusCode) {
case 200:
apiResponse.data = User.fromJson(json.decode(response.body));
break;
case 422:
final error = json.decode(response.body)['errors'];
apiResponse.message = error[error.keys.elementAt(0)][0];
break;
case 401:
apiResponse.message = json.decode(response.body)['message'];
break;
default:
apiResponse.message = projectApis.errorMessage;
break;
}
} catch (e) {
apiResponse.message = projectApis.errorMessageServer;
}
return apiResponse;
}

这是ApiResponse

class ApiResponse {
Object? data;
String message = '';
}

这是用户型号

class User {
User({
required this.name,
required this.email,
required this.token,
required this.id,
});
int id;
String name;
String email;
String token;
factory User.fromJson(Map<String, dynamic> json) => User(
id: json["id"],
name: json["name"],
email: json["email"],
token: json["token"],
);
Map<String, dynamic> toJson() => {
"id": id,
"name": name,
"email": email,
"token": token,
};
@override
String toString() {
return 'User{ name: $name, email: $email, token: $token}';
}
}

这是的登录方法

loginUser() async {
ApiResponse response = await authController.login(
_emailController.text,
_passwordController.text,
);
if (response.message == "success") {
saveAndRedirectToHome(response.data as User);
} else {
setState(() {
isLoading = false;
});
Get.snackbar(
"",
"${response.message}",
snackPosition: SnackPosition.BOTTOM,
colorText: Colors.white,
backgroundColor: Colors.red,
);
}
}
void saveAndRedirectToHome(User user) async {
SharedPreferences pref = await SharedPreferences.getInstance();
await pref.setString('token', user.token);
await pref.setInt('userId', user.id);
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(builder: (context) => BottomNavigation()),
(route) => false);
}

API 的登录响应

{
"token": "30|CEqsqkpyJvZCLg88jh3fPTTxkJB4lGhForIKtcth",
"email": "testi@gmail.com",
"name": "Kennedy Owusu"
}

当成功时,您忘记在交换机案例中设置消息:

case 200:
apiResponse.data = User.fromJson(json.decode(response.body));
apiResponse.message = 'success'; //add this line here
break;

并且您的响应不包括id,所以将其转换为nullable:

class User {
User({
required this.name,
required this.email,
required this.token,
this.id,
});
int? id;
String name;
String email;
String token;
factory User.fromJson(Map<String, dynamic> json) => User(
id: json["id"],
name: json["name"],
email: json["email"],
token: json["token"],
);
Map<String, dynamic> toJson() => {
"id": id,
"name": name,
"email": email,
"token": token,
};
@override
String toString() {
return 'User{ name: $name, email: $email, token: $token}';
}
}

最新更新