Как избежать многократного вызова Observable RxDart

Я внедрил шаблон 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();

person Android    schedule 06.09.2019    source источник


Ответы (1)


Проблема в том, что вы регистрируете слушателя (вызывая listen) каждый раз, когда вызываете _validateInputs. Вам следует один раз прослушать в initState или попробовать first свойство из Observable, которое возвращает будущее.

person Martyns    schedule 06.09.2019