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