【问题标题】:Is there a way to check if a stream/subject has an error?有没有办法检查流/主题是否有错误?
【发布时间】:2020-01-07 07:54:17
【问题描述】:

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

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

这是我的一些代码:

我如何创建我的主题:

  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 循环检查错误,只返回表单是否已完成。我不知道处理这种情况的最佳方法是什么。你们能帮帮我吗?

【问题讨论】:

标签: flutter dart rxdart


【解决方案1】:

好的,所以这不是问题的真正答案,而是我所做的更多解决方法......

我为我拥有的每个可观察对象创建了一个包含布尔值的列表,并使用 onData 和 onError 我更改了列表的值,然后在按下按钮时检查所有值是否为真。我仍然不知道它是否是最好的解决方案,但它肯定比旧的更好。

代码如下:

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;
  }

【讨论】:

    猜你喜欢
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 2014-12-22
    • 2018-01-09
    • 2011-12-01
    相关资源
    最近更新 更多