Трепетание, как слушать ответ websocket? - PullRequest
0 голосов
/ 23 мая 2018

Как мы все знаем, у flutter есть пример использования websocket, но он просто получает ответ websocket в виде потока и что-то вроде этого:

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

Мне нужна асинхронная функция, которая получаеткаждый ответ веб-сокета и добавьте результат в список, чтобы можно было обновить вид списка.

Как получить ответ веб-сокета в виде текста или 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..Как сделать так, чтобы поток можно было прослушивать при каждом начале, а затем boradcast на многих страницах?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Убедитесь, что вы закрываете свое соединение WebSocket, когда вы покидаете текущий виджет.Внутри класса State вашего виджета у вас должен быть метод dispose(), который выглядит следующим образом:

@override
void dispose() {
  widget.channel.sink.close();
  super.dispose();
}
0 голосов
/ 23 мая 2018

То, что я хочу, - это асинхронная функция, которая получает каждый ответ веб-сокета и добавляет результат в список, так что представление списка может быть обновлено.

Вам нужно управлять этим самостоятельнов вашем классе состояний.

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 */
    },
  );
}

при повторном входе на эту страницу произошла ошибка, которая говорит о плохом состоянии: поток уже прослушан .. Как сделать так, чтобы поток можно было прослушивать при каждом запускеи затем boradcast на много страниц?

Дарт имеет два вида потоков , одноподписные и широковещательные потоки.См. Дополнительную информацию о отличиях и о том, как создавать потоки .Рекомендации здесь будут во многом зависеть от вашего приложения.

Тем не менее, обычно apis, которые возвращают поток по умолчанию для одноподписной подписки, а затем имеют альтернативу asBroadcastStream().

Если это не вариант, вы можете создать промежуточный StreamController, которыйпрослушивает ваш поток с одной подпиской и возвращает широковещательный поток, который должна прослушивать остальная часть вашего приложения.

Обе эти опции описаны в приведенной выше ссылке о создании потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...