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

时间:2019-01-30 08:40:46

标签: dart stream 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);
      },
    );
  }
}

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

该小部件销毁后,我如何才能退出视频流?或者它将自动退出视频流?

4 个答案:

答案 0 :(得分:2)

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

我认为一个好的解决方案是让一个有状态的小部件拥有您的BLoC,并使用其dispose方法关闭流。

This article显示了一种可能的实现方法,请看一下BlocProvider类。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

要将流传递到无状态窗口小部件,您应该关闭该流,以覆盖与您有该流实例的有状态窗口小部件关联的子类State类的dispose方法。另外,在此小部件中,您必须检查snapshot.data是否为 null (并返回例如Container()),否则由于未传递{ {1}}到initialData

答案 3 :(得分:0)

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

如果Stream不会用于其他任何用途,最好的办法是以某种方式处置Stream(通过将其包装在StatefulWidget上或使用{{ 1}}方法。

如果您在其他地方使用BlocProvider,或者将来使用Stream,则不必担心在{{1} }。。只要您在其他所有人停止使用它时将其丢弃。

Stream本身是从{strong> StreamBuilder 扩展而来的,它使用自己的StreamBuilder处理StreamBuilderBase方法。

这是StatefulWidget库的摘录。

StreamSubscription

如您所见,disposeasync.dart上初始化,并在State的/// 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; } } } 调用中自动取消,因此此处使用的订阅将始终关闭,您不会不必担心。