jun*_*unk 5 stream dart 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);
},
);
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个无状态的小部件,dispose()那里没有方法。
以及当此小部件销毁时,我如何才能退出视频流或将自动退出视频流?
不,它不会关闭Stream,但会关闭StreamSubscription用于构建小部件的 。
如果Stream不打算用于其他任何事情,最好以Stream某种方式处理它(通过将其包装在 a 上StatefulWidget或使用一种BlocProvider方法)。
如果您在Stream其他地方使用 a或者您将来会使用Stream,则无需担心在StreamBuilder. 只要你在其他人停止使用它时处理它。
TheStreamBuilder本身从StreamBuilderBasewhich is aStatefulWidget扩展,并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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
可以看到,在State的调用上StreamSubscription初始化initState并自动取消dispose,所以这里使用的订阅会一直关闭,不用担心。
在无状态小部件中,当小部件从小部件树中删除时,StreamBuilder 本身将“自动关闭”。你不需要处理任何事情。
但是,如果您有一个发送快照的 StreamController,则应在完成后手动关闭它。
您要将流传递到无状态小部件中,您应该关闭该流,并覆盖与dispose拥有该流实例的有状态小部件关联的子类 State 类的方法。另外,在此小部件中,您必须检查是否为snapshot.datanull (并返回例如 a Container()),否则您会收到错误,因为您没有将 an 传递initialData给StreamBuilder。