gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:40:56 27 4
gpt4 key购买 nike

当我在 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调用上自动取消,所以订阅此处使用将始终关闭,您无需担心。

关于dart - StreamBuilder 会在无状态小部件中自动关闭流吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54436397/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com