颤振如何聆听websocket的响应?

颤振如何聆听websocket的响应?,websocket,dart,flutter,Websocket,Dart,Flutter,众所周知,“颤振”有一个使用websocket的示例,但它只接收websocket响应作为流,如下所示: new StreamBuilder( stream: widget.channel.stream, builder: (context, snapshot) { return new Text(snapshot.hasData ? '${snapshot.data}' : ''); }, ); @override void dispose() { widget.ch

众所周知,“颤振”有一个使用websocket的示例,但它只接收websocket响应作为流,如下所示:

new StreamBuilder(
  stream: widget.channel.stream,
  builder: (context, snapshot) {
    return new Text(snapshot.hasData ? '${snapshot.data}' : '');
  },
);
@override
void dispose() {
  widget.channel.sink.close();
  super.dispose();
}
我想要的是一个异步函数,它接收每个websocket响应并将结果附加到列表中,以便可以更新listview

如何以文本或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();
});
这可以在一个页面中工作,但当再次进入该页面时,出现一个错误,显示
错误状态:流已被侦听。
。 如何让每一个开始都能听到流,然后广播到许多页面

我想要的是一个接收每个websocket的异步函数 响应并将结果附加到列表中,以便可以创建listview 更新

您需要在state类中自己管理它

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 */
    },
  );
}
final list=list();
@凌驾
小部件构建(构建上下文){
返回新的StreamBuilder(
流:myStream,
生成器:(上下文,快照){
添加(/*从快照中提取消息*/);
/*用你的列表构建一个小部件*/
},
);
}
当再次进入该页面时,出现了一个错误,显示为Bad state:Stream 已经听过了。。如何使溪流能被聆听 在每一个开始,然后广播到许多页

Dart具有单一订阅和广播流。查看有关的详细信息,以及如何。此处的建议在很大程度上取决于您的应用程序

这就是说,通常API会将流默认返回给单个订阅,然后使用
asBroadcastStream()
选项

如果这不是一个选项,您可以创建一个中间
StreamController
,它监听您的单个订阅流并返回一个广播流,您的应用程序的其余部分应该监听该广播流


以上关于创建流的链接概述了这两个选项。

请确保在离开当前小部件时关闭WebSocket连接。在小部件的
State
类中,应该有一个
dispose()
方法,如下所示:

new StreamBuilder(
  stream: widget.channel.stream,
  builder: (context, snapshot) {
    return new Text(snapshot.hasData ? '${snapshot.data}' : '');
  },
);
@override
void dispose() {
  widget.channel.sink.close();
  super.dispose();
}

您是否尝试过在StreamBuilder中返回ListView.builder如果您编写websocket后端,您可以让它在每次更新时返回完整列表,这样我就可以为您编写解决方案了。若它逐个返回一个项目,那个么您需要创建本地列表,将快照附加到其中,然后使用listviewbuilder@Tree您好,我正在使用websocket进行聊天,因此服务器的返回是一个接一个的,我需要监听流,并广播到我需要该流的任何页面(用发送者地址标识它们),这就像Telegrame之类的聊天应用程序,你找到解决方案了吗?@stt106还没有,websokcet会多次接收数据,每次用户界面更新……如果该页面关闭,如何在其他页面接收数据?(如果我正在构建聊天应用程序,则应在任何地方接收消息)