如何将ValueNotifier转换为流?

时间:2019-07-12 22:16:41

标签: flutter dart

我的代码( TextEdittingController )上有一些值通知器,我想将它们转换为流,因此我可以使用rx_dart的Observable.combineLatest检查是否所有它们在我的代码中一次为空,返回检查结果( bool )并将其仅嵌入到一个StreamBuilder中。

类似的东西:

StreamBuilder<bool>(
          stream: Observe.combineLatest2(STREAM1, STREAM2, (s1,s2) => s1.text.isNotEmpty && s2.text.isNotEmpty),
          builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
            if (snapshot.data == true) {
              return ShowUp.fifth(
                child: Padding(
                  padding: const EdgeInsets.all(16),
                  child: RaisedButton(
                    shape: StadiumBorder(),
                    child: Text("Finish"),
                    onPressed: _finishPressed,
                  ),
                ),
              );
            } else {
              return Container();
            }
          },
        )

如何将ValueNotifier转换为流?

1 个答案:

答案 0 :(得分:0)

我提供的解决方案就是那种解决方案,但我不知道这是否是正确的方法。我会在这里分享,但我希望有人有更好的目标:

记住:使用后必须调用它的关闭方法,否则它将泄漏。

class ValueNotifierStream<T> extends Stream<T> {
  final ValueNotifier _valueNotifier;
  final _subject = BehaviorSubject<T>();
  VoidCallback _notifierCallback;

  ValueNotifierStream(this._valueNotifier) {
    _subject.add(_valueNotifier.value);

    _notifierCallback = () {
      _subject.add(_valueNotifier.value);
    };

    _valueNotifier.addListener(_notifierCallback);
  }

  @override
  StreamSubscription<T> listen(
    void Function(T event) onData, {
    Function onError,
    void Function() onDone,
    bool cancelOnError,
  }) {
    return _subject.listen(
      onData,
      onError: onError,
      onDone: onDone,
      cancelOnError: cancelOnError,
    );
  }

  void close() {
    _valueNotifier.removeListener(_notifierCallback);
    _subject.close();
  }
}