首页 > 解决方案 > 为什么在 Fluttter 中调用加载状态后调用 loadInitTopStory 方法?

问题描述

HackerNewsLoadedState 在 HackerNewsLoadingState 之前调用,它从 API 加载所有数据,但不集成到 _topStories 列表中,并在调用 HackerNewsLoadedState 后将数据存储到 _topstories。

 @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;
  }

标签: flutterapidartbloc

解决方案


找到解决方案它返回 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;
  }

推荐阅读