为什么GetConnect/GetX/Flutter没有调用我的后端并返回null对象



我使用的是get:4.6.5

我已经定义了一个提供商

class CredentialsProvider extends GetConnect implements GetxService {
@override
void onInit() {
httpClient.defaultDecoder =
(val) => Auth.fromJson(val as Map<String, dynamic>);
httpClient.baseUrl = 'http://localhost:1337/api/';
super.onInit();
}
Future<Response<dynamic>> postCredentials(Credentials credentials) async {
return await post('auth/local', credentials);
}
}

在我的绑定类中,将其添加为依赖

class LoginBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut(() => CredentialsProvider());
Get.lazyPut(() => LoginController());
}
}

并将LoginView注册为路由

GetPage(
name: "/login",
page: () => const LoginView(),
binding: LoginBinding(),
)

并将其添加到我的控制器中

class LoginController extends GetxController {
final provider = Get.put(CredentialsProvider());
//...
}

控制器用于我的LoginView

class LoginView extends GetView<LoginController> {...}

在LoginView的MaterialButton中,我使用onPressed调用提供程序,获得结果对象Auth并将其打印为json。

onPressed: () {
var c = Credentials(
identifier: controller.emailController.text,
password: controller.passwordController.text);
controller.provider.postCredentials(c).then((value) {
var auth = value.body as Auth;
print(auth.toJson());
});
},

我使用GetX cli:从JSON生成了我的Auth模型

class Auth {
String? jwt;
User? user;
Auth({this.jwt, this.user});
Auth.fromJson(Map<String, dynamic> json) {
jwt = json['jwt'];
user = json['user'] != null ? User?.fromJson(json['user']) : null;
}
Map<String, dynamic> toJson() {
final data = <String, dynamic>{};
data['jwt'] = jwt;
if (user != null) {
data['user'] = user?.toJson();
}
return data;
}
}
class User {
int? id;
String? username;
String? email;
String? provider;
bool? confirmed;
bool? blocked;
String? createdAt;
String? updatedAt;
User(
{this.id,
this.username,
this.email,
this.provider,
this.confirmed,
this.blocked,
this.createdAt,
this.updatedAt});
User.fromJson(Map<String, dynamic> json) {
id = json['id'];
username = json['username'];
email = json['email'];
provider = json['provider'];
confirmed = json['confirmed'];
blocked = json['blocked'];
createdAt = json['createdAt'];
updatedAt = json['updatedAt'];
}
Map<String, dynamic> toJson() {
final data = <String, dynamic>{};
data['id'] = id;
data['username'] = username;
data['email'] = email;
data['provider'] = provider;
data['confirmed'] = confirmed;
data['blocked'] = blocked;
data['createdAt'] = createdAt;
data['updatedAt'] = updatedAt;
return data;
}
}

我在控制台中得到的是

flutter: {jwt: null}

而且我的本地主机服务从未被调用。

问题在于请求的解码器与响应的解码器不同。所以我最终得到了这样的东西:

Future<Auth> postCredentials(Map<String, dynamic> body) async {
var response = await post(
contentType: 'application/json',
decoder: (val) => Auth.fromJson(val as Map<String, dynamic>),
"/api/auth/local",
body);
return response.body as Auth;
}

我通过呼叫

controller.provider.postCredentials(credentials.toJson());

最新更新