flutter - Flutter-流错误未持续(使用阵营模式)

标签 flutter dart stream

因此,我尝试使用流和块模式在flutter中制作一个注册表单。

问题是添加到接收器的流中的错误似乎没有持续存在?

SubmitValid getter似乎没有考虑添加到passwordretype流中的错误,这导致登录按钮在不应该单击时可以单击

重现步骤:

  • 填写有效的电子邮件
  • 填写有效的密码(密码字段)
  • 填写有效密码(密码重新输入字段)
  • 从重新输入字段
  • 中删除所有内容
  • 从密码字段中删除所有内容。
  • 在密码字段中输入有效密码,即使重新输入字段为空,登录按钮也可单击。

  • 这是我的代码以及屏幕截图。

    Bloc.dart
    import 'dart:async';
    import 'package:firebase_auth/firebase_auth.dart';
    
    import 'validators.dart';
    import 'dart:io';
    import 'package:rxdart/rxdart.dart';
    
    class Bloc extends Object with Validators {
    
      final _email = BehaviorSubject<String>();
      final _password = BehaviorSubject<String>();
      final _passwordretype = BehaviorSubject<String>();
      final _isSignedIn = BehaviorSubject<bool>();
    
      //Add data to stream
      Stream<String> get email => _email.stream.transform(validateEmail);
      Stream<String> get password => _password.stream.transform(validatePassword);
    
      Stream<String> get passwordretype=> _passwordretype.stream.transform(validatePasswordRetype)
      .doOnData((String c){
        if(0 != _password.value.compareTo(c)){
          _passwordretype.addError("Passwords do not match");
        }
      });
    
      Stream<bool> get signInStatus => _isSignedIn.stream;
    
      Stream<bool> get submitValid =>
        Rx.combineLatest3(email, password, passwordretype, (e, p, r) => true);
    
    
      //Change data
      Function(String) get changeEmail => _email.sink.add;
      Function(String) get changePassword => _password.sink.add;
      Function(String) get changePasswordRetype => _passwordretype.sink.add;
      Function(bool) get showProgressBar => _isSignedIn.add;
    
      register() async {
    
        final FirebaseAuth _auth = FirebaseAuth.instance;
    
        try {
          showProgressBar(true);
          final FirebaseUser user = (await _auth.createUserWithEmailAndPassword(
            email: _email.value,
            password: _password.value,
          ))
              .user;
          if (user != null) {
    //        setState(() {
    //          _success = true;
    //          _userEmail = user.email;
    //          Navigator.of(context).pushNamedAndRemoveUntil(
    //              '/home', (Route<dynamic> route) => false);
    //
    ////        Navigator.of(context).pushReplacementNamed('/home');
    //
    //        });
          } else {
    //        Scaffold.of(context).showSnackBar(SnackBar(
    //          content: Text("Error occured, please try again later"),
    //        ));
    //        _success = false;
          }
        } catch (err) {
          _isSignedIn.addError(err);
          print(err);
    //      setState(() {
    //        _showLoading = false;
    //        _error = true;
    //      });
        }
    
    
    
      }
    
    
    
      dispose() {
        _email.drain();
        _email.close();
        _password.drain();
        _password.close();
        _passwordretype.drain();
        _passwordretype.close();
      }
    
    }
    

    SignupScreen.dart
    import 'package:firebase_auth/firebase_auth.dart';
    import 'package:flutter/material.dart';
    import 'package:lendy/src/blocs/bloc.dart';
    import 'package:lendy/src/blocs/provider.dart';
    
    class SignupScreen extends StatelessWidget {
    //  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
    //  final TextEditingController _emailController = TextEditingController();
    //  final TextEditingController _passwordController = TextEditingController();
    //  final TextEditingController _passwordController2 = TextEditingController();
      final FirebaseAuth _auth = FirebaseAuth.instance;
    //  final GoogleSignIn _googleSignIn = GoogleSignIn();
      String _userID = "";
    
      bool _success;
      String _userEmail;
    
      @override
      Widget build(BuildContext context) {
        final bloc = Provider.of(context);
    
        return Scaffold(
          appBar: AppBar(
            title: Text("Signup"),
          ),
          body: Container(
            child: Column(
              children: <Widget>[
                emailField(bloc),
                passwordField(bloc),
                passwordFieldRe(bloc),
                SizedBox(
                  height: 10.0,
                ),
                button(bloc)
              ],
            ),
          ),
        );
      }
    
      Widget emailField(Bloc bloc) {
        return StreamBuilder(
          stream: bloc.email,
          builder: (context, snapshot) {
            return TextField(
              onChanged: bloc.changeEmail,
              keyboardType: TextInputType.emailAddress,
              decoration: InputDecoration(
                  hintText: 'Enter email address',
                  labelText: 'Email-address',
                  errorText: snapshot.error),
            );
          },
        );
      }
    
      Widget passwordField(Bloc bloc) {
        return StreamBuilder(
            stream: bloc.password,
            builder: (context, snapshot) {
              return TextField(
                onChanged: bloc.changePassword,
                decoration: InputDecoration(
                    hintText: 'Enter password',
                    labelText: 'Password',
                    errorText: snapshot.error),
              );
            });
      }
    
      Widget passwordFieldRe(Bloc bloc) {
        return StreamBuilder(
            stream: bloc.passwordretype,
            builder: (context, snapshot) {
              return TextField(
                onChanged: bloc.changePasswordRetype,
                decoration: InputDecoration(
                    hintText: 'Retype password',
                    labelText: 'Password',
                    errorText: snapshot.error),
              );
            });
      }
    
      Widget button(Bloc bloc) {
        return StreamBuilder(
          stream: bloc.submitValid,
          builder: (context, snapshot) {
            return RaisedButton(
                child: Text('Register'),
                color: Colors.blue,
                //if true
                onPressed: snapshot.hasData
                    ? () {
    //            bloc.showProgressBar(true);
                        bloc.register();
                      }
                    : null);
          },
        );
      }
    
      Widget buttons(Bloc bloc) {
        return StreamBuilder(
          stream: bloc.submitValid,
          builder: (context, snapshot1) {
            return StreamBuilder(
              stream: bloc.signInStatus,
              builder: (context, snapshot2) {
                if (!snapshot2.hasData || snapshot2.hasError) {
                  return Column(
                    children: <Widget>[
                      RaisedButton(
                        child: Text('Register'),
                        color: Colors.blue,
                        onPressed: snapshot1.hasData
                            ? () {
                          bloc.register();
                        }
                            : null,
                      ),
                      snapshot2.hasError ? Text("ee") : Container()
                    ],
                  );
                } else {
                  return CircularProgressIndicator();
                }
              },
            );
          },
        );
      }
    
      Widget submitButton(Bloc bloc) {
        return StreamBuilder(
            stream: bloc.signInStatus,
            builder: (context, snapshot) {
              if (snapshot.hasError || !snapshot.hasData) {
                return buttons(bloc);
              } else {
                return CircularProgressIndicator();
              }
            });
    
    
      }
    
    /
    

    验证程序
    import 'dart:async';
    
    class Validators {
    
      final validateEmail = StreamTransformer<String, String>.fromHandlers(
          handleData: (email, sink){
            if (RegExp(
            r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+")
            .hasMatch(email)){
              sink.add(email);
            } else {
              sink.addError('Please enter a valid email address.');
            }
          }
      );
    
      final validatePassword = StreamTransformer<String, String>.fromHandlers(
          handleData: (password, sink){
            if (password.length > 3){
              sink.add(password);
            } else {
              sink.addError('Password is too short.');
            }
          }
      );
    
    
      final validatePasswordRetype = StreamTransformer<String, String>.fromHandlers(
          handleData: (password, sink){
            print("HANDLE DATA");
            if (password.length > 3){
              sink.add(password);
            } else {
              sink.addError('Password is too short.');
            }
          }
      );
    
    
    }
    

    screenshot

    最佳答案

    对于submitValid流,您使用的是BehaviorSubjects而不是stream.transforms,因此,由于这个原因,您的submitValid不会收到错误。将您的submitValid替换为下一个代码:
    Stream<bool> get submitValid => Rx.combineLatest3(email, password, passwordretype, (e, p, r) => true);

    关于flutter - Flutter-流错误未持续(使用阵营模式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60310058/

    相关文章:

    Dart 处理 future 的方法

    flutter - 如何从右上角而不是左上角启动CustomClipper(ClipPath)

    android - Wowza:音频文件中的Vod自适应比特率流传输问题

    java - 使用 Stream.of 检查 List<String> 是否以另一个字符串开头

    flutter - Flutter FutureProvider值未在Builder方法中更新

    flutter - 如何摆脱应用栏和正文之间的线?

    dart - Flutter 在一个条件下关闭一个对话框

    facebook - 找出共享帖子的原作者(阅读新闻源时的 "via X")

    flutter - 如何将2个容器在堆栈中居中放置

    flutter - 如何将 Flutter Canvas 保存为位图图像?