Cod*_*on 1 dart flutter stream-builder
我有一个DefaultTabController有两个选项卡的工作正常。在我的第二个选项卡上,我最近添加了一个stream controller用于在每次值发生变化时更新屏幕上的值,这也可以正常工作,但如果我要快速向左移动到第一个选项卡,然后返回到第二个选项卡,则会出现以下错误。
Stream has already been listened to.
我有一个处置功能,但由于没有导航到另一个页面,它不会触发,因此它创建了许多流,我不希望它这样做。
下面的所有代码都是针对流控制器的,如果我注释掉所有这些代码,应用程序可以正常工作,不会出现错误,而且我还发现,如果我只注释掉,stream: stream_controller.stream,我也不会收到错误。
StreamController<int> stream_controller = StreamController<int>();
Run Code Online (Sandbox Code Playgroud)
@override
void dispose(){
super.dispose();
stream_controller.close();
}
Run Code Online (Sandbox Code Playgroud)
StreamBuilder(
initialData: 0,
stream: stream_controller.stream,
builder: (context, snapshot) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
'#${snapshot.data}',
),
);
})
Run Code Online (Sandbox Code Playgroud)
stream_controller.sink.add(rank);
Run Code Online (Sandbox Code Playgroud)
Stream<T>s 只能听一次。要启用任意数量的侦听器,请使用:
StreamController<int> stream_controller = StreamController<int>.broadcast();
Run Code Online (Sandbox Code Playgroud)
此外,在您的上下文中,您似乎正在重用同一个StreamController实例。initState尝试在内部而不是作为类字段定义它:
class _MyState extends State<T> {
late StreamController<int> stream_controller;
@override
void initState() {
super.initState();
stream_controller = StreamController<int>.broadcast();
}
@override
void dispose(){
stream_controller.close();
super.dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
广播流允许任意数量的侦听器,并且当事件准备好时,无论是否有侦听器,它都会触发其事件。
有关详细信息,请参阅完整Stream文档。
| 归档时间: |
|
| 查看次数: |
6384 次 |
| 最近记录: |