当我在 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;
}
}
}
如你所见,StreamSubscription
在initState
上初始化,在State的dispose
调用上自动取消,所以订阅此处使用将始终关闭,您无需担心。
https://stackoverflow.com/questions/54436397/