Nic*_*ela 6 websocket dart flutter
众所周知,flutter 有一个使用 websocket 的例子,但它只是以流的形式接收 websocket 响应,就像这样:
new StreamBuilder(
stream: widget.channel.stream,
builder: (context, snapshot) {
return new Text(snapshot.hasData ? '${snapshot.data}' : '');
},
);
Run Code Online (Sandbox Code Playgroud)
我想要的是一个异步函数,它接收每个 websocket 响应并将结果附加到列表中,以便可以更新列表视图。
无论如何如何以文本或json的形式获取websocket响应?
更新:我知道现在有一些像 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();
});
Run Code Online (Sandbox Code Playgroud)
这可以在一个页面中工作,但是当再次进入该页面时,出现错误提示Bad state: Stream has already been listened to.。如何让流可以在每次开始时收听,然后广播到许多页面?
我想要的是一个异步函数,它接收每个 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 */
},
);
}
Run Code Online (Sandbox Code Playgroud)
再次进入该页面时,出现错误,显示Bad state: Stream has been Listened.. 如何使流可以在每次开始时收听,然后广播到多个页面?
Dart 有两种流,单订阅流和广播流。查看有关差异以及如何创建流的更多信息。这里的建议很大程度上取决于您的应用。
也就是说,通常返回流的 api 默认为单订阅,然后有替代asBroadcastStream()方案。
如果这不是一个选项,您可以创建一个中间体StreamController来侦听您的单订阅流并返回广播流,您的应用程序的其余部分应该侦听该广播流。
上面关于创建流的链接中概述了这两个选项。
| 归档时间: |
|
| 查看次数: |
6774 次 |
| 最近记录: |