我正在收听一个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.
如何将其作为广播,其他页面可以接收该广播?
答案 0 :(得分:0)
由于没有有用的答案,因此我在这里更新答案以供其他参考。
如果您仅使用StreamBuilder,则流只能侦听一次。考虑一下,如果您的流可以收听许多其他页面或小部件,那么数据将被重复。
这确实是在开发复杂的应用程序时可能发生的,例如,您正在构建聊天应用程序,出现新消息,您应该更新许多页面的UI(您的对话框聊天ui,您的会话列表ui ....) ,那么您应该在许多页面上订阅此视频流,我仍然没有找到合适的方法来这样做,除了使该视频流得以广播并完成您的工作。
答案 1 :(得分:0)
您可以使用广播。
//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()”的流,则只能有一个侦听器
答案 2 :(得分:0)
软件包web_socket_channel的解决方案:
final channel = IOWebSocketChannel.connect(socketUrl);
final streamController = StreamController.broadcast();
streamController.addStream(channel.stream);
之后,只需使用streamController.stream
来监听Web套接字事件。