Flutter 如何监听 websocket 响应?

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.。如何让流可以在每次开始时收听,然后广播到许多页面?

Edm*_*man 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 */
    },
  );
}
Run Code Online (Sandbox Code Playgroud)

再次进入该页面时,出现错误,显示Bad state: Stream has been Listened.. 如何使流可以在每次开始时收听,然后广播到多个页面?

Dart 有两种流,单订阅流和广播流。查看有关差异以及如何创建流的更多信息。这里的建议很大程度上取决于您的应用。

也就是说,通常返回流的 api 默认为单订阅,然后有替代asBroadcastStream()方案。

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

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