StreamBuilder запускает метод дважды, в то время как та же операция, что и переменная, запускается только один раз.

У меня есть 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 и установить в конструкторе ее желаемую наблюдаемую. Хотя это решение звучит как обходной путь, и я не уверен, почему метод будет запускаться дважды.

Любые идеи?


person Eliya Cohen    schedule 06.11.2019    source источник


Ответы (1)


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

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

person Filip P.    schedule 06.11.2019