Флаттер отправляет вход в блок, используя поток "RxDart" - PullRequest
0 голосов
/ 26 сентября 2019

Я пишу приложение для флаттера с архитектурой Bloc с помощью go API, и у меня возникает проблема, которая возникает, когда я нажимаю кнопку входа в систему после получения результата, если имя пользователя и пароль действительны.Я верну сообщение «ошибка, имя пользователя и пароль не действительны», если произошла ошибка.

извините за мой плохой английский.


//my bloc.dart login 
class Bloc extends Validators {
  final _email = BehaviorSubject<String>();
  final _password = BehaviorSubject<String>();

  //add to the stram

  Stream<String> get email => _email.stream.transform(validateEmail);
  Stream<String> get password => _password.stream.transform(validatePassword);
  Stream<bool> get submitValid =>
      Observable.combineLatest2(email, password, (e, p) => true);

  //change Data
  Function(String) get changeEmail => _email.sink.add;
  Function(String) get changePassword => _password.sink.add;

  submit() {
    print('your email is :' + _email.value);
    print('your password is :' + _password.value);
    // result = http request 
    // show the error to the user if there are  

  }

  dispose() {
    _email.close();
    _password.close();
  }
}

// my validator.dart

class Validators {
  final validateEmail = StreamTransformer<String, String>.fromHandlers(
      handleData: (String email, EventSink<String> sink) {
        if (email.contains('@')) {
          sink.add(email);
        } else {
          sink.addError('Enter a valid email');
        }
      }
  );

  final validatePassword = StreamTransformer<String, String>.fromHandlers(
      handleData: (String password, EventSink<String> sink) {
        if (password.length > 3) {
          sink.add(password);
        } else {
          sink.addError('Enter must be at least 4 characters');
        }
      }
  );
}

// отправить виджет флаттера

Widget submitButton(Bloc bloc) => StreamBuilder<bool>(
        stream: bloc.submitValid,
        builder: (context, snap) {
          return Column(
            children: <Widget>[
              RaisedButton(
                onPressed: (!snap.hasData) ? null : bloc.submit,
                child: Text(
                  'Login',
                  style: TextStyle(color: Colors.white),
                ),
                color: Colors.blue,
              ),
              Text((!snap.hasError) ? "" : "The result of the api" )
            ],
          );
        },
      );

1 Ответ

0 голосов
/ 26 сентября 2019

Вы не можете сделать это так, потому что вам нужно добавить ошибку в поток, и для этого вам нужен StreamController.Например, вы можете сделать следующее: _email.addError("some_error"); и тогда эта ошибка будет обнаружена потоковым компоновщиком.Я вам в этом помогу.

...