Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart StreamBuilder会在无状态小部件中自动关闭流吗?_Dart_Stream_Flutter - Fatal编程技术网

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

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

当我在颤振中使用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);
      },
    );
  }
}
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的流