有没有办法检查流/主题是否有错误?

时间:2019-09-04 12:08:46

标签: flutter dart rxdart

我正在使用BehaviorSubjects创建Flutter表单,并且我有一些必填字段,因此在继续下一步之前,需要检查它们。但是,其中一些还具有一些额外的要求,可以被认为是可以的,例如电子邮件字段。如果这些字段不符合要求,则在这些字段中使用流转换器(.fromHandlers)添加错误。我以为有一些“ hasError”方法可以检查BehaviorSubject,但是没有。

我目前正在通过有一个提交按钮来处理此问题,在点击该按钮时,使用一些代码来验证表单,这些代码看起来像我在转换器上拥有的Handlers方法,但是我认为这看起来不是一个好的解决方案: (

这是我的一些代码:

我如何创建主题:

  Observable<String> get email => _email.stream.transform(validateEmail);

表单的提交功能:

bool submitSignUp() {
    bool ok = true;

    if (getEmail == null || !validEmail(getEmail)) {
      ok = false;
      _email.addError("* Digite um email válido");
    }

    if (getfullName == null || getfullName.length < 3) {
      ok = false;
      _fullName.addError("* Digite um nome válido");
    }

    if (getPassword == null || getPassword.length < 6) {
      ok = false;
      _password.addError("* A senha deve conter pelo menos 6 caracteres.");
    }

    if (getPhoneNumber == null || getPhoneNumber.length < 11) {
      ok = false;
      _phoneNumber.addError("* Digite um número de telefone válido");
    }

    return ok;
  }

我的验证器看起来像这样:

final validateEmail = StreamTransformer<String, String>.fromHandlers(
    handleData: (email, sink) {
      RegExp emailRegExp = RegExp(
          r'^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$');
      if (email.isEmpty) {
        sink.addError("* Campo obrigatório");
      } else if (!emailRegExp.hasMatch(email)) {
        sink.addError("* Digite um email válido");
      } else {
        sink.add(email);
      }
    },
  );

如果存在“ hasError”方法,我可以创建一个包含所有BehaviorSubjects的列表,并进行for循环检查错误,只是返回表单是否完成。我不知道什么是应对这种情况的最佳方法。你们可以帮我吗?

1 个答案:

答案 0 :(得分:0)

好,所以这并不是问题的真正答案,而是我所做的替代方法...

我制作了一个列表,其中包含每个可观察到的布尔值,并使用onData和onError更改列表的值,然后在按下按钮时检查所有值是否为true。我仍然不知道这是否是最好的解决方案,但是绝对比旧的解决方案好。

代码如下:

SignupOrEditBloc() {
    List<Observable> observables = [
      displayName,
      fullName,
      email,
      cpf,
      rg,
      birthday,
      cep,
      address,
      addressNumber,
      neighborhood,
      state,
      city,
    ];

    for (var i = 0; i < observables.length; i++) {
      boolList.add(false);
      observables[i]
          .listen((_) => boolList[i] = true)
          .onError((_) => boolList[i] = false);
    }
  }

和提交功能:

bool submitSignup() {
    bool ok = true;

    for (var i = 0; i < boolList.length; i++) {
      ok = ok && boolList[i];
    }

    for (BehaviorSubject subject in subjects()) {
      if (subject.value == null || subject.value == "") {
        subject.addError("* Campo obrigatório");
      }
    }

    return ok;
  }