Flutter 使用流“RxDart”提交登录 Bloc

Posted

技术标签:

【中文标题】Flutter 使用流“RxDart”提交登录 Bloc【英文标题】:Flutter submit login Bloc using stream " RxDart" 【发布时间】:2020-01-26 16:02:34 【问题描述】:

我正在使用带有 go API 的 Bloc 架构编写一个颤振应用程序,当我按下我的登录按钮时,我有一些我想要的问题,在我检索到用户名和密码是否有效的结果之后。如果是错误,我将返回文本“错误用户名和密码无效”。

对不起,我的英语不好。


//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();
  

//我的验证器.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');
        
      
  );

//提交flutter小部件

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" )
            ],
          );
        ,
      );

【问题讨论】:

尝试将您的 onPressed 更改为: onPressed: (!snap.hasData) ? () : () => bloc.submit(), 查看flutter_form_bloc,你可以用更少的代码实现你想要的。 【参考方案1】:

您不能那样做,因为您必须向流中添加错误,为此您需要 StreamController。例如,您可以执行以下操作: _email.addError("some_error"); 然后该错误将被流生成器捕获。我会帮你的。

【讨论】:

以上是关于Flutter 使用流“RxDart”提交登录 Bloc的主要内容,如果未能解决你的问题,请参考以下文章

使用 rxDart 合并 Firestore 流

Flutter状态管理:RxDart

Flutter状态管理:RxDart

Flutter-如何在没有 RxDart 的情况下从 Stream<String> 获取最后一个值?

Dart流.asBroadcastStream内存泄漏

如何在颤振中降级 rxdart 插件?