Воссоздать поток после навигации обратно на флаттер - PullRequest
0 голосов
/ 30 октября 2019

Сценарий: я создаю поток снимков Firebase и делаю некоторые вычисления из этих данных, прежде чем показывать эти окончательные данные на виджете / странице. Пользователь нажимает на элементы в этом виджете и переходит на новую страницу. (работа, проделанная на этой странице, влияет на поток на первой странице). После того, как пользователь вернется назад с помощью кнопки «Назад», я хочу создать новый поток и снова выполнить расчет, чтобы показать правильные данные.

Вопрос: как мне это сделать без утечек памяти. Я имею в виду, как отследить навигацию назад и избавиться от предыдущего потока и создать новый поток? На данный момент я получаю Badstate исключения, если я пытаюсь воссоздать streamcontroller или stream.

Код:

Поток

Future<Stream> getData() async {
  Stream stream1 = _getReceiverStream();
  Stream stream2 = _getSenderStream();
  return StreamGroup.merge([stream1, stream2]).asBroadcastStream();
}

Контроллер потока

@override
void initState() {
  streamController = StreamController();
  streamController.stream.listen((p) => readData(p));
  setupData();
}


setupData() async {
  Stream<dynamic> stream = await service.getData();
  stream.pipe(streamController);
}

1 Ответ

0 голосов
/ 30 октября 2019

Сначала назначьте StreamSubscription глобальной переменной. Затем отмените его перед удалением streamController. Для отслеживания навигации пользователя обратно на страницу реализуйте метод didPopNext RoutAware. Там располагаем и воссоздаем поток и контроллер.

См. Код ниже.

streamController = StreamController();
subscription = streamController.stream.listen((p) => readData(p));

 @override
  void dispose() async {
    super.dispose();
    routeObserver.unsubscribe(this);
    await unregisterFromDataStream();
  }

  Future<void> unregisterFromDataStream() async {
    if (subscription != null) {
      subscription.cancel();
    }
    if (streamController != null) {
      await streamController.close();
      streamController = null;
    }
  }

  @override
  void didPopNext() async {
    await unregisterFromDataStream();
    setupController();
    setupDataStream();

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