我组装了一个示例应用程序,它使用流实现用户名和密码字段,并使用验证转换进行验证。为此,我使用了RxDart,并连接了"Login“按钮,以便根据2流结果为true启用/禁用。
bloc.dart
Stream<bool> get submitValidWithCombineLatestStream =>
CombineLatestStream([email, password], (list) => true);login_page.dart
Widget submitButton(Bloc bloc) {
return StreamBuilder(
stream: bloc.submitValidWithCombineLatestStream,
builder: (_, snapshot) {
return RaisedButton(
color: Colors.deepPurpleAccent,
child: Text(
'Submit',
style: TextStyle(color: Colors.white),
),
onPressed: !snapshot.hasData ? null : bloc.submit,
);
},
);
}我使用flutter_bloc编写了相同的示例应用程序,但我试图弄清楚如何启用/禁用CombineLatestStream的“登录”按钮。有人知道怎么做吗?
我意识到这完全是过头了,但是我正试图用这个简单的例子来解决这个问题,并且我不知道如何在转换到RxDart (flutter_bloc)之后访问所有酷的flutter_bloc功能。我希望在不导入/使用RxDart的情况下,这两个世界都是最好的。
这有可能吗?
我要找的一个例子是:
。
发布于 2020-12-19 07:53:25
在主组类中出现问题,请查看此github代码,https://github.com/hoc081098/flutter_validation_login_form_BLoC_pattern_RxDart
简单地说,您可以使用CombineLatestStream,您可以在主组类中设置如下,
return LoginBloc._(
emailChanged: emailS.add,
passwordChanged: passwordS.add,
submitLogin: () => submitLoginS.add(null),
emailError$: emailError$,
passwordError$: passwordError$,
isLoading$: isLoadingS.stream,
message$: message$,
dispose: DisposeBag([...subjects, message$.connect()]).dispose,
); 发布于 2020-12-25 16:57:49
这就是如何使用RxDart组合流和块,如果监听器中有新的内容,就会产生新的值,仅此而已。当您想要调用后端时,您可以创建侦听器。
import 'dart:async';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:rxdart/rxdart.dart';
class TestState {
final bool isValid;
TestState(this.isValid);
}
class TestCubit extends Cubit<TestState> {
final List<StreamSubscription> _ss = [];
final _emailSubject = BehaviorSubject<String>.seeded(null);
final _passwordSubject = BehaviorSubject<String>.seeded(null);
TestCubit() : super(TestState(false)) {
_ss.add(_subscribeToEmailAndPassword());
}
StreamSubscription _subscribeToEmailAndPassword() {
return Rx.combineLatest([_emailSubject, _passwordSubject], (list) {
if (list[0] != null && list[1] != null) {
return true;
}
return false;
}).listen((value) {
emit(TestState(value));
});
}
@override
Future<void> close() async {
_ss.forEach((e) async => await e.cancel());
await super.close();
}
void emailFieldChange(String email) {
_emailSubject.add(email);
}
void passwordFieldChange(String password) {
_passwordSubject.add(password);
}
}https://stackoverflow.com/questions/65312343
复制相似问题