RxDart. Прослушиватель BehaviorSubject не получает значения после subject.add (значение)

#flutter #dart #rxdart

#flutter #dart #rxdart

Вопрос:

У меня есть два класса: CurrencyRepo и CurrencyFetcher. Из CurrencyFetcher я пытаюсь прослушать BehaviorSubject, который находится в репозитории. Но когда я добавляю значения в BehaviorSubject внутри репозитория, CurrencyFetcher не получает эти значения. Что я делаю не так?

 class CurrencyFetcher implements CurrencyFetcherService {
  final CurrencyRepo _currencyRepo;
  StreamSubscription currencySubscription;

  CurrencyFetcher(this._currencyRepo, this._preferencesService) {
    _subscribeToCurrencies();
  }

  void _subscribeToCurrencies() {
    currencySubscription = _currencyRepo
        .getCurrenciesStream()
        .listen((currencies) => _handleApiCurrencies);
  }

  Future<void> _handleApiCurrencies(List<ApiCurrency> apiCurrencies) async {
  // implemetation
  }
}
  
 class CurrencyRepo {
  final CurrencyApi _currencyApi;
  final BehaviorSubject<List<ApiCurrency>> _currencySubject = BehaviorSubject.seeded([]);

  Stream<List<ApiCurrency>> getCurrenciesStream() {
    _updateCurrencies();
    return _currencySubject.stream;
  }

  CurrencyRepo(this._currencyApi);

  void _updateCurrencies() {
    _currencyApi.getCurrencies().then((currencies) {
      _currencySubject.add(currencies);
    });
  }
}
  

Я проверил, что значения добавляются в поток после того, как CurrencyFetcher начинает прослушивать. И я проверил, что в тот момент, когда я добавляю новое значение в поток, у него есть слушатель. Кто-нибудь может помочь при первом использовании RxDart? 🙂

Комментарии:

1. Я попытался отладить его, поставил точку останова внутри этого обратного вызова и я увидел, что список ‘currencies’ не пуст, он содержит 61 элемент

Ответ №1:

Внутри функции _subscribeToCurrencies() попробуйте написать

 _currencyRepo.currenciesStream.listen((currencies) {
      _handleApiCurrencies(currencies);
});
  

вместо

 _currencyRepo.currenciesStream.listen(_handleApiCurrencies);