如何听取websocket响应?

时间:2018-05-23 03:40:10

标签: websocket dart flutter

众所周知,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.。 如何使流可以在每个开始时听,然后播放到很多页面?

2 个答案:

答案 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();
}