首页 > 解决方案 > Flutter如何监听websocket响应?

问题描述

众所周知,flutter 有一个使用 websocket 的例子,但它只是接收 websocket 响应作为流,就像这样:

new StreamBuilder(
  stream: widget.channel.stream,
  builder: (context, snapshot) {
    return new Text(snapshot.hasData ? '${snapshot.data}' : '');
  },
);

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

无论如何,如何将 websocket 响应作为文本或 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.。如何使流可以在每次开始时被收听,然后广播到多个页面?

标签: websocketdartflutter

解决方案


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

@override
void dispose() {
  widget.channel.sink.close();
  super.dispose();
}

推荐阅读