Вернуть данные с экрана и добавить их в поток

Я пытаюсь вернуть данные с экрана после его закрытия, а затем добавить их в контроллер потока в моем BLoC. Однако, когда я пытаюсь получить значение с помощью _bloc.streamController.value, оно равно нулю. Контроллер потока - это BehaviorSubject.

  void _getDataFromSomeScreen(context) async {
    final data = await Navigator.push(
            context, MaterialPageRoute(builder: (context) => SomeScreen()))
        .then((onValue) {});

    _bloc.streamController.sink.add(data);
  }

Другие варианты, которые я пробовал, включают в себя вызовink.add внутри оператора then, передавая мой блок функции.

Если я удалю async и await и просто жестко запрограммирую значение, похоже, это сработает. Почему из-за асинхронности мои данные не сохраняются в моем контроллере потока?

  void _getDataFromSomeScreen(context) {
   _bloc.streamController.sink.add('some data');
  }

Как я могу вернуть данные с экрана и добавить их в свой контроллер потока?


person Arizona1911    schedule 24.01.2019    source источник
comment
Попробуйте удалить .then() - дождитесь результата Navigator.push()   -  person Richard Heap    schedule 25.01.2019
comment
@RichardHeap Я пробовал это. Я также попытался установить поток внутри оператора then. Я также пробовал передать свой блок в функцию.   -  person Arizona1911    schedule 25.01.2019
comment
вы уверены, что результат final data = await ... не равен нулю?   -  person diegoveloper    schedule 25.01.2019
comment
@diegoveloper Да, я дважды проверил, чтобы убедиться, что он не равен нулю. У меня даже была проверка if (data! = Null), но я удалил ее перед отправкой вопроса.   -  person Arizona1911    schedule 25.01.2019
comment
если вы добавите _bloc.streamController.sink.add (testtt); на вашем первом коде, он работает?   -  person diegoveloper    schedule 25.01.2019
comment
Да, он добавит testtt в поток, но затем, когда я проверю _bloc.streamController.value в другой части кода, значение будет нулевым. Возможно ли, что вызов Navigator.push сбрасывает мой блок? У меня есть провайдер, который содержит блок. Блок извлекается путем вызова Provider.of (context) внутри метода сборки.   -  person Arizona1911    schedule 25.01.2019


Ответы (1)


Не стоит совмещать 2 способа работы с Futures.

  1. Вы можете использовать метод async / await.

    Future<void> _getDataFromSomeScreen(context) async {
      final data = await Navigator.push(
            context, MaterialPageRoute(builder: (context) => SomeScreen()));
      _bloc.streamController.sink.add(data);
    }
    
  2. Можно использовать «старомодный» метод.

    void _getDataFromSomeScreen(context) {
      Navigator.push(
        context, MaterialPageRoute(builder: (context) => SomeScreen()))
      .then((data) => _bloc.streamController.sink.add(data));
    }
    
person BambinoUA    schedule 19.04.2019
comment
Первый способ предпочтительнее, потому что он похож на стиль синхронного программирования. - person BambinoUA; 19.04.2019