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的主要内容,如果未能解决你的问题,请参考以下文章