如何使 websocket 流广播到许多其他页面?
Posted
技术标签:
【中文标题】如何使 websocket 流广播到许多其他页面?【英文标题】:How to make websocket stream broadcast to many other pages? 【发布时间】:2018-11-02 02:24:09 【问题描述】:我正在监听一个 websocket 流:
widget.channel.stream.listen((data)
print("!!!!new msg: $data");
var dataJson = json.decode(data);
print(dataJson["content"]);
// do my job
setState(()
_allAnimateMessages.insert(0, newMsg);
);
newMsg.animationController.forward();
);
但是,当再次进入该页面时,出现错误:
Bad state: Stream has already been listened to.
如何使它成为广播,其他页面可以接收该广播?
【问题讨论】:
您能否提供更多提示您正在使用什么: - 什么库/包 - 什么是channel
? - 这段代码在您的应用程序中的什么位置?
【参考方案1】:
由于没有有用的答案,我在这里更新我的答案以供其他参考。
-
重复订阅流是 Flutter 中的一种期望行为。
如果您只是使用 StreamBuilder,则该流只能监听一次。想一想,如果您的流可以监听许多其他页面或小部件,那么数据将被重复。
-
但如果您想使用一个流,并更新所有小部件
在开发复杂的应用程序时确实会发生这种情况,例如,您正在构建一个聊天应用程序,新消息来了,您应该更新许多页面 UI(您的对话聊天 ui,您的会话列表 ui....) ,那么你应该在很多页面中订阅这个流,我仍然没有找到合适的方法来做到这一点,除了让这个流被广播,然后做你的工作。
【讨论】:
【参考方案2】:您可以使用广播。
//Here is the solution
StreamController<String> streamController = new StreamController.broadcast(); //Add .broadcast here
//Now you can listen from various places
@override
void initState()
super.initState();
print("Creating a StreamController...");
//First subscription
streamController.stream.listen((data)
print("DataReceived1: " + data);
, onDone: ()
print("Task Done1");
, onError: (error)
print("Some Error1");
);
//Second subscription
streamController.stream.listen((data)
print("DataReceived2: " + data);
, onDone: ()
print("Task Done2");
, onError: (error)
print("Some Error2");
);
streamController.add("This a test data");
print("code controller is here");
字体:https://medium.com/@ayushpguptaapg/using-streams-in-flutter-62fed41662e4
使用广播时,您可以在同一个流中拥有多个侦听器。
如果你只是使用没有“.broadcast()”的流,你只能有一个监听器
【讨论】:
添加消息必须调用streamController.add()
,那么如何在另一个类或页面上获取streamController
的引用对象呢?【参考方案3】:
解决方案web_socket_channel:
final channel = IOWebSocketChannel.connect(socketUrl);
final streamController = StreamController.broadcast();
streamController.addStream(channel.stream);
之后只需使用streamController.stream
来监听网络套接字事件。
【讨论】:
以上是关于如何使 websocket 流广播到许多其他页面?的主要内容,如果未能解决你的问题,请参考以下文章
为需要在我的网站上自动更新数据的每个页面制作许多 https websocket 服务器是不是很好?
javascript中的Websockets,页面刷新或导航到其他页面时连接终止[重复]
结合实际需求,在webapi内利用WebSocket建立单向的消息推送平台,让A页面和服务端建立WebSocket连接,让其他页面可以及时给A页面推送消息