例如,当我在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()
方法;
该小部件销毁后,我如何才能退出视频流?或者它将自动退出视频流?
答案 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
如您所见,dispose
在async.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;
}
}
}
调用中自动取消,因此此处使用的订阅将始终关闭,您不会不必担心。