我已经在登录屏幕上实现了BLOC模式。
下面的代码是按钮单击事件,这里发生的情况是,当我第一次以错误的凭据单击“登录”按钮时,它一次显示了小吃栏;如果再次单击该按钮,它将显示两次;如果再次单击,它将显示两次,所以上...
Future _validateInputs() async {
final form = _loginKey.currentState;
if (form.validate()) {
print(_userIDController.text + _passwordController.text);
bloc.validateLogin(_userIDController.text, _passwordController.text);
bloc.loginDetails.listen((loginDetails){
if(loginDetails != null) {
if(loginDetails.loginStatus) {
// Navigate to Home
print("Login Sucess");
} else {
print(loginDetails.failureMessage);
scaffoldKey.currentState.showSnackBar(SnackBar(
content: Text('Invalid Username or Password'),
));
//bloc.clear();
}
}
});
}
}
}
这是我的BLOC代码,我不知道我在哪里做错了。
class LoginBloc {
final _repository = Repository();
var _doLogin = PublishSubject<LoginModel>();
Observable<LoginModel> get loginDetails => _doLogin.stream;
validateLogin(String userName,String password) async {
LoginModel itemModel = await _repository.doLogin(userName,password);
_doLogin.sink.add(itemModel);
}
dispose() {
_doLogin.close();
}
}
final bloc = LoginBloc();
答案 0 :(得分:0)
问题是您每次调用listen
时都在注册一个侦听器(通过调用_validateInputs
)。您应该在initState中侦听一次,或者尝试从Observable
的{{3}}属性中返回一个Future。