flutter: Another exception was thrown: Bad state: Stream has already been listened to.
yt19860606 opened this issue · 6 comments
你好,我的项目框架是这个样子,BottomNavWidgetState 在push进一个详情页面里面,进入后使用啦websocket获取数据,这个详情页面结构使用了 TabController 创建了几个标签,然后切换,在每一个标签页面,我获取数据使用
WebSocketChannel channel;
_tabController = new TabController(length: 3, vsync: this);
void initState() {
super.initState();
channel = new IOWebSocketChannel.connect('ws://192.168.1.232:8765');
}
@OverRide
void dispose() {
// TODO: implement dispose
_tabController.dispose();
// widget.channel.sink.close();
controller.sink.close();
super.dispose();
}
return new Scaffold(
appBar: new AppBar(
title: new Text(appBarTitle),
),
body: Scaffold(
appBar: bottomTabbar(tabController: _tabController, tags: _tags),
body: TabBarView(
controller: _tabController,
children: _tags.map((Choice choise) {
switch (_tabController.index) {
case 0:
{
return new SafeArea(
child: new StreamBuilder(
stream: widget.channel.stream, .....
.....
)
)break;
case 1:
{
return new SafeArea(
child: new StreamBuilder(
stream: widget.channel.stream,
.....
)
)break;
}
case 1:
{
return new SafeArea(
child: new StreamBuilder(
stream: widget.channel.stream,
.....
)
)break;
}
刚进入这个页面没有问题,但是点击标签切换过去,再切换回来就出现这个问题flutter: Another exception was thrown: Bad state: Stream has already been listened to.
和你的bloc_demo 提到出现问题应该是一样的,但是具体到我这里就不知道怎么做
谢谢,但是我还是不太会,找遍全网,没有看见这方面好的demo,可以提供一下么?
每个标签都维护一个单独的IOWebSocketChannel,或者先在收听的时候清除上一个订阅
我记得单订阅流整个生命周期内只能有一个听众来着,貌似 @xiaonanhailili 同学说的第二种是不行的。第一个理论上是可以的。
做法就是在每个 Tab 页面,都做成一个 StatefulWidget 然后在 State 中初始化一个 IOWebSocketChannel 就可以了
由于 15 天没有继续讨论故关闭此 issue