Dart StreamBuilder会在无状态小部件中自动关闭流吗?
当我在颤振中使用BLOC时,例如:Dart StreamBuilder会在无状态小部件中自动关闭流吗?,dart,stream,flutter,Dart,Stream,Flutter,当我在颤振中使用BLOC时,例如: class StreamText extends StatelessWidget { StreamText( this.stream, { this.style, }); final Stream<dynamic> stream; final TextStyle style; @override Widget build(BuildContext context) { return StreamB
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);
},
);
}
}
class StreamText扩展了无状态小部件{
流文本(
这条小溪{
这种风格,
});
最终河流;
最终文本样式;
@凌驾
小部件构建(构建上下文){
返回流生成器(
小溪:小溪,
生成器:(上下文,快照){
返回文本(snapshot.data.toString(),样式:style);
},
);
}
}
这是一个无状态小部件,没有dispose()
方法
当这个小部件被破坏时,我怎么能关闭流或者它会自动关闭流呢?如果你正在将一个流传递到一个无状态小部件,你应该关闭流,覆盖与有状态小部件相关联的子类状态类的
dispose
方法,在这个有状态小部件中你有流的实例。此外,在此小部件中,您必须检查快照.data是否为null(并返回一个容器()
),或者您收到一个错误,因为您没有将初始数据
传递给StreamBuilder
否,它不会自动关闭。通常,流的所有者是管理流状态的人
在我看来,一个好的解决方案是让一个有状态的小部件拥有您的BLoCs,并在其dispose
方法中关闭流
显示了一种可能的实现方法,请查看
BlocProvider
类。在无状态小部件中,当小部件从小部件树中删除时,StreamBuilder本身将“自动关闭”。你不需要处理任何事情
但是,如果您有一个发送快照的StreamController,您应该在完成后手动关闭它 否,它不会关闭
流
,但会关闭用于构建小部件的流订阅
如果流
不用于任何其他用途,最好是以某种方式处理流
(通过将其包装在StatefulWidget
上或使用BlocProvider
方法)
如果您正在其他地方使用流
,或者将来将使用流
,则无需担心在StreamBuilder
上使用该流时内存泄漏,只要您在其他人停止使用时处置它即可
StreamBuilder
本身从StreamBuilderBase
扩展而来,StreamBuilderBase是一个StatefulWidget
,它用自己的dispose
方法处理StreamSubscription
这是async.dart
库的摘录
///StreamBuilderBase]的状态。
类_StreamBuilderBaseState扩展状态{
流动认购(流动认购);;
@凌驾
void initState(){
//...
_订阅();
}
@凌驾
无效处置(){
_取消订阅();
super.dispose();
}
作废(订阅){
if(widget.stream!=null){
_订阅=widget.stream.listen((T数据){
//...
}
}
作废(取消订阅){
如果(_订阅!=null){
_订阅。取消();
_订阅=空;
}
}
}
如您所见,
StreamSubscription
在initState
上初始化,并在状态的dispose
调用中自动取消,因此此处使用的订阅将始终关闭,您无需担心。“关闭流”
?这是什么意思?StreamController.close()
?@pskink-yep。这就是在StatefulWidget
中“重写dispose方法”
?dispose()
是一种状态
的方法对不起,你是对的,我指的是与statusful小部件关联的State子类。如何从stream builder或无状态小部件中的Observable关闭流?我知道如何关闭BehaviorSubject的流