rx dart 组合多个流以在任何一个流发出值时发出值

Cod*_*rit 6 dart flutter combinelatest rxdart

在 RX dart 中,有一种RX.combineLatest使用回调函数组合流结果的方法。问题是它仅在每个流都发出值时才发出值。如果没有,则不会发射。

每当任何流序列发出一个项目时,都使用组合器函数将给定的流合并为单个流序列。 在所有流都发出至少一项之前,流不会发出。

我试图将多个流合并到一个流中进行验证,当流未发出或发出空值时,该验证应发出 false 或 true 。

class FormBloc {
  final BehaviorSubject<bool> _result = BehaviorSubject();
  final BehaviorSubject<String?> _usernameController = BehaviorSubject();
  final BehaviorSubject<String?> _emailController = BehaviorSubject();

  // Will only emit if each stream emitted a value
  // If only username is emitted valid is not emitted
  Stream<bool> get valid$ => Rx.combineLatest2(
    _usernameController.stream, 
    _emailController.stream, 
    (username, email) => username != null || email != null
  );

}

Run Code Online (Sandbox Code Playgroud)

我如何加入这些流,以便在任何流发生变化valid$时发出一个值?

小智 0

创建发出当前值的新流并监听该流是我的最佳实践。

class FormBloc {
  final BehaviorSubject<bool> _result = BehaviorSubject();
  final BehaviorSubject<String?> _usernameController = BehaviorSubject();
  final BehaviorSubject<String?> _emailController = BehaviorSubject();

  final _usernameStreamController = StreamController<String?>()
    ..add(_usernameController.value)
    ..addStream(_usernameController.stream);
  final _emailStreamController = StreamController<String?>()
    ..add(_emailController.value)
    ..addStream(_emailController.stream);

  Stream<bool> get valid$ => Rx.combineLatest2(
    _usernameStreamController.stream,  // use streamController instead
    _emailStreamController.stream,  // use streamController instead
    (username, email) => username != null || email != null
  );
}
Run Code Online (Sandbox Code Playgroud)