StreamBuilder запускает метод дважды, а та же операция, что и для переменной, запускается только один раз. - PullRequest
1 голос
/ 06 ноября 2019

У меня есть StreamBuilder, который принимает поток от моего сервиса. Это выглядит так:

StreamBuilder(
  stream: MyService.getStream$()
  builder (...)
);

Плюс, у меня есть служба с использованием следующего метода:

getStream$() {
  print('being printed twice');
  return Observable.just('text')
    .doOnData(() => print('being printed twice too'));
}

Когда я запускаю приложение, я получаю напечатанную дважды prints(каждый).

Но, когда я изменяю следующую реализацию как переменную, она запускается только один раз:

Observable getStream = Observable
  .just('text')
  .doOnData((data) => print('being printed once');

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

Что я могу сделать, это объявить переменную Observable и в конструкторе установить ее на мойжелаемый наблюдаемый. Хотя это решение звучит как обходной путь, и я не уверен, почему метод будет вызван дважды.

Есть идеи?

1 Ответ

1 голос
/ 06 ноября 2019

StreamBuilder перестраивается каждый раз, когда вызывается метод сборки. Это означает, что MyService.getStream$() оценивается с каждым вызовом и создает новый Observable. Если вы назначите Observable переменной, она будет создана один раз и повторно использована между вызовами сборки.

Взгляните на этот вопрос Будущее выполняется дважды, потому что оно в методе сборки, как это исправить? этоо будущем, но механизм тот же.

...