首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Rx.CombineLatestStream包实现flutter_bloc

如何使用Rx.CombineLatestStream包实现flutter_bloc
EN

Stack Overflow用户
提问于 2020-12-15 19:19:48
回答 2查看 1K关注 0票数 0

我组装了一个示例应用程序,它使用流实现用户名和密码字段,并使用验证转换进行验证。为此,我使用了RxDart,并连接了"Login“按钮,以便根据2流结果为true启用/禁用。

bloc.dart

代码语言:javascript
复制
  Stream<bool> get submitValidWithCombineLatestStream =>
  CombineLatestStream([email, password], (list) => true);

login_page.dart

代码语言:javascript
复制
 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的情况下,这两个世界都是最好的。

这有可能吗?

我要找的一个例子是:

  • ,我正在构建一个表单,它需要三个不同的后端调用。我更喜欢显示进度指示,而所有3个调用都在工作,并阻塞,直到所有3个调用返回。我想通过CombineLatestStreams做这件事,因为所有三次返回蒸汽期货。

EN

回答 2

Stack Overflow用户

发布于 2020-12-19 07:53:25

在主组类中出现问题,请查看此github代码,https://github.com/hoc081098/flutter_validation_login_form_BLoC_pattern_RxDart

简单地说,您可以使用CombineLatestStream,您可以在主组类中设置如下,

代码语言:javascript
复制
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,
    ); 
票数 0
EN

Stack Overflow用户

发布于 2020-12-25 16:57:49

这就是如何使用RxDart组合流和块,如果监听器中有新的内容,就会产生新的值,仅此而已。当您想要调用后端时,您可以创建侦听器。

代码语言:javascript
复制
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);
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65312343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档