dart - StreamBuilder 会在无状态小部件中自动关闭流吗?

当我在 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() 方法;

当这个小部件被破坏时,我怎么能关闭流,或者它会自动关闭流?

最佳答案

不,它不会关闭 Stream,但会关闭用于构建 Widget 的 StreamSubscription

如果 Stream 不用于其他任何用途,最好的办法是以某种方式处理 Stream(通过将其包装在 StatefulWidget 或使用 BlocProvider 方法)。

如果您在其他地方使用 Stream,或者您将来会使用 Stream,则无需担心内存泄漏在 StreamBuilder 上。 只要您在其他人停止使用它时将其丢弃。

StreamBuilder 本身扩展自 StreamBuilderBase,它是一个 StatefulWidget,它处理 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;
    }
  }
}

如你所见,StreamSubscriptioninitState上初始化,在State的dispose调用上自动取消,所以订阅此处使用将始终关闭,您无需担心。

https://stackoverflow.com/questions/54436397/

相关文章:

dart - Flutter Drawer 作为单独的小部件不允许修改宽度

dart - Flutter - 修复抽屉页眉

dart - Streambuilder 没有收到一些快照数据

dart - 在 CustomScrollView 中使用 StreamBuilder 和 Sliv

dart - 从 LatLng 列表计算总距离

regex - Flutter 无法解析正则表达式

dart - 在 Flutter 应用程序中存储外观和指标常量

user-interface - 如何在 flutter 中获得相对于屏幕尺寸的小部件尺寸?

flutter - 如何更改 CupertinoDatePicker 显示语言?

dart - 在 Flutter 中查找和版本化过时的包(跨主要版本)