我正在为我的项目使用Bloc架构师。我正在尝试使用我的应用程序的Ui中的Bloc文件中的函数,并将表单发送到服务器并使用响应。但是当我进行调用时,它返回null。虽然我的应用程序的其他部分(即repo等)的响应不为空,这里是我的Ui的代码:
MaterialButton(
color: Colors.deepPurple,
minWidth: screenAwareSize(500, context),
onPressed: () {
_submitForm(authBloc, user, pass);
},
void _submitForm(AuthBloc authBloc, String user, String pass) async {
formKey.currentState.save();
if (formKey.currentState.validate()) {
var response = await authBloc.login(user, pass);
//when I print(response) it shows null
}
}
这是我的集体课:
class AuthBloc extends MainBloc {
final Repo _repo = Repo();
PublishSubject<Future<UserModel>> _authController = new PublishSubject<Future<UserModel>>();
Observable<Future<UserModel>> get auth => _authController.stream;
login(String user, String pass) async {
Future<UserModel> item = await _repo.login(user, pass);
_authController.sink.add(item);
}
dispose() {
_authController.close();
}
}
AuthBloc authBloc = new AuthBloc();
这是我的API类:
class API{
Future<UserModel> login(String user, String pass) async {
var response =
await client.get(base_url + "login.php?user=${user}&pass=${pass}");
return UserModel.fromJSON(json.decode(response.body));
}}
这是我的回购课程:
class Repo {
final API api = new API();
login(String user, String pass) async => await api.login(user, pass);}
你的功能login(String user, String pass)
似乎没有返回任何东西。默认情况下,它将返回Future<void>
。这就是你的回答为空的原因。
解决此问题的最简单方法是返回登录功能中的项目,如下所示。
Future<UserModel> login(String user, String pass) async {
return _repo.login(user, pass);
}
虽然,这可能会奏效。我不认为这是以Rx方式使用Bloc架构的正确方法。
您可以考虑在视图中使用FutureBuilder
或StreamBuilder
。并将你的auth
转换为Future<UserModel>
的类型。并使您的视图订阅AuthBloc
中的更改。