StreamBuilder会自动关闭无状态窗口小部件中的流吗?

jun*_*unk 5 stream dart flutter

例如,当我在Flutter中使用BLOC时:

class StreamText extends StatelessWidget {
  StreamText(
    this.stream, {
    this.style,
  });

  final Stream<dynamic> stream;
  final TextStyle style;

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<dynamic>(
      stream: stream,
      builder: (context, snapshot) {
        return Text(snapshot.data.toString(), style: style);
      },
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

这是一个无状态的小部件,dispose()那里没有方法。

以及当此小部件销毁时,我如何才能退出视频流或将自动退出视频流?

Evi*_*n1_ 6

不,它不会关闭Stream,但会关闭StreamSubscription用于构建小部件的 。

如果Stream不打算用于其他任何事情,最好以Stream某种方式处理它(通过将其包装在 a 上StatefulWidget或使用一种BlocProvider方法)。

如果您在Stream其他地方使用 a或者您将来会使用Stream,则无需担心在StreamBuilder. 只要你在其他人停止使用它时处理它。

TheStreamBuilder本身从StreamBuilderBasewhich is aStatefulWidget扩展,并StreamSubscription用自己的dispose方法处理 。

这是async.dart图书馆的摘录。

/// State for [StreamBuilderBase].
class _StreamBuilderBaseState<T, S> extends State<StreamBuilderBase<T, S>> {
  StreamSubscription<T> _subscription;

  @override
  void initState() {
    //...
    _subscribe();
  }

  @override
  void dispose() {
    _unsubscribe();
    super.dispose();
  }

  void _subscribe() {
    if (widget.stream != null) {
      _subscription = widget.stream.listen((T data) {
    //...
    }
  }

  void _unsubscribe() {
    if (_subscription != null) {
      _subscription.cancel();
      _subscription = null;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

可以看到,在State的调用上StreamSubscription初始化initState并自动取消dispose,所以这里使用的订阅会一直关闭,不用担心。


Edm*_*man 5

不,它不会自动关闭。通常,流的所有者是管理流状态的人。

在我看来,一个好的解决方案是让有状态小部件拥有您的 BLoC 并关闭其dispose方法中的流。

这篇文章展示了一种可能的方法来实现这一点,看看这个BlocProvider类。


Kir*_*zin 5

在无状态小部件中,当小部件从小部件树中删除时,StreamBuilder 本身将“自动关闭”。你不需要处理任何事情。

但是,如果您有一个发送快照的 StreamController,则应在完成后手动关闭它。


Fra*_*neo 1

您要将流传递到无状态小部件中,您应该关闭该流,并覆盖与dispose拥有该流实例的有状态小部件关联的子类 State 类的方法。另外,在此小部件中,您必须检查是否为snapshot.datanull 并返回例如 a Container()),否则您会收到错误,因为您没有将 an 传递initialDataStreamBuilder

  • `“重写 dispose 方法”` - 在 `StatefulWidget` 中?`dispose()` 是一个 `State` 的方法 (2认同)