众所周知,flutter有一个使用websocket的例子,但它只是接收websocket响应作为流,就像这样:
new StreamBuilder(
stream: widget.channel.stream,
builder: (context, snapshot) {
return new Text(snapshot.hasData ? '${snapshot.data}' : '');
},
);
我想要的是一个异步函数,它接收每个websocket响应并将结果附加到列表中,以便列表视图可以更新。
如何将websocket响应作为text或json获取?
更新: 我知道现在有一些像stream.listen这样的方法:
widget.channel.stream.listen((data) {
print("!!!!new msg: $data");
var dataJson = json.decode(data);
print(dataJson["content"]);
// do something after received data
setState(() {
_allAnimateMessages.insert(0, newMsg);
});
newMsg.animationController.forward();
});
这可以在页面中使用,但是当再次进入该页面时,会出现错误Bad state: Stream has already been listened to.
。
如何使流可以在每个开始时听,然后播放到很多页面?
答案 0 :(得分:0)
我想要的是一个接收每个websocket的异步函数 响应并将结果附加到列表中,以便列表视图可以 更新。
您需要在州级别自己管理。
final list = List<Message>();
@override
Widget build(BuildContext context) {
return new StreamBuilder(
stream: myStream,
builder: (context, snapshot) {
list.add(/* extract message from snapshot */);
/* build a widget with your list */
},
);
}
再次进入该页面时,出现错误状态:Bad state:Stream 已经听过了..如何使流可以被监听 在每个开始,然后播放到很多页面?
Dart拥有two kinds of streams个单订阅和广播流。查看有关differences以及如何create streams的更多信息。这里的建议很大程度上取决于您的应用。
也就是说,通常apis返回一个默认为单一订阅的流,然后使用asBroadcastStream()
替代。
如果这不是一个选项,您可以创建一个中间StreamController
来监听您的单订阅流并返回一个广播流,应用程序的其余部分应该收听。
以上关于创建流的链接概述了这两个选项。
答案 1 :(得分:0)
确保在离开当前窗口小部件时关闭WebSocket连接。在您的小部件的State
课程中,您应该使用dispose()
方法,如下所示:
@override
void dispose() {
widget.channel.sink.close();
super.dispose();
}