Почему метод loadInitTopStory вызывается после вызова загруженного состояния в flutter?

#flutter #api #dart #bloc

#flutter #API #dart #блок

Вопрос:

HackerNewsLoadedState вызывается перед HackerNewsLoadingState и загружает все данные из API, но не интегрируется в список _topStories, а также не сохраняет данные в _topstories после вызова HackerNewsLoadedState.

  @override
  Stream<HackerNewsState> mapEventToState(HackerNewsEvent event) async* {
    if (event is FetchHackerNewsEvent) {
      yield HackerNewsLoadingState();

      try {
        _loadInitTopStories();
        yield HackerNewsLoadedState(story: _topStories);
      } catch (e) {
        yield HackerNewsErrorState(message: e.toString());
      }
    }
  }
  void _loadInitTopStories() async {
    try {
      _topStoryIds.addAll(await _repository.loadTopStoryIds());
    } catch (e) {
      _topStoriesStreamController.sink.addError('Unknown Error');
      return;
    }

    loadMoreTopStories(pageSize: INIT_PAGE_SIZE);
  }

void loadMoreTopStories({int pageSize = PAGE_SIZE}) async {
    if (_isLoadingMoreTopStories) return;

    _isLoadingMoreTopStories = true;
    final storySize = min(_currentStoryIndex   pageSize, _topStoryIds.length);
    for (int index = _currentStoryIndex; index < storySize; index  ) {
      try {
        _topStories.add(await _repository.loadStory(_topStoryIds[index]));
      } catch (e) {
        print('Failed to load story with id ${_topStoryIds[index]}');
      }
    }
    _currentStoryIndex = _topStories.length;
    _topStoriesStreamController.sink.add(_topStories);
    _isLoadingMoreTopStories = false;
  }
 

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

1. Вам нужно предоставить более подробную информацию о коде, лучшим было бы предоставить код, который может воспроизвести проблему.

2. обновите мой код, пожалуйста, проверьте его

3. почему HackerNewsLoadedState is called before HackerNewsLoadingState ? где инициализация _topStories ?

4. но когда я использовал без вызова метода, он работает со мной

5. вы используете блок? Я предлагаю вам предоставить больше кода, кода, который можно воспроизвести.

Ответ №1:

Найдено решение, оно возвращает void, но это ошибка, оно возвращает Stream

   Stream<HackerNewsState> _loadInitTopStories() async* {
    yield HackerNewsLoadingState();
    try {
      _topStoryIds.addAll(await repository.loadTopStoryIds());
    } catch (e) {
      _topStoriesStreamController.sink.addError('Unknown Error');
      return;
    }
    yield* loadMoreTopStories(pageSize: INIT_PAGE_SIZE);
    yield HackerNewsLoadedState(story: _topStories);
  }

  Stream<HackerNewsState> loadMoreTopStories(
      {int pageSize = PAGE_SIZE}) async* {
    if (_isLoadingMoreTopStories) return;

    _isLoadingMoreTopStories = true;
    final storySize = min(_currentStoryIndex   pageSize, _topStoryIds.length);
    for (int index = _currentStoryIndex; index < storySize; index  ) {
      try {
        _topStories.add(await repository.loadStory(_topStoryIds[index]));
      } catch (e) {
        print('Failed to load story with id ${_topStoryIds[index]}');
      }
    }
    _currentStoryIndex = _topStories.length;
    _topStoriesStreamController.sink.add(_topStories);
    _isLoadingMoreTopStories = false;
  }