Свиток Бесконечность Flutter: как вызвать его только один за прокрутку - PullRequest
1 голос
/ 11 апреля 2020

Я строю навигацию к приложению флаттера (Infinity Scroll), и мне это удается с логической точки (прокрутка большего количества данных).

Но сейчас я сталкиваюсь с огромной проблемой, то есть я использую DDOS-атаку на мой сервер: "S

Когда я прокручиваю вниз, я отправляю более 100 запросов за раз вверх и вниз !!!

Это произошло из-за следующего кода

final _scrollThreshold = 200;

void _onScroll() {
  final maxScroll = _scrollController.position.maxScrollExtent;
  final currentScroll = _scrollController.position.pixels;
  if (maxScroll - currentScroll <= _scrollThreshold) {
    BlocProvider.of<SearchBloc>(context).add(SearchPosts(
      pageNo: _pageNo++,
      query: _searchText.text
    ));
  }
}

Проблема в последнем диапазоне (последние 200 пикселей), если пользователь не двигал рукой и не ждал и продолжает играть, говорит, что следующая страница загружена, функция будет много запускаться

Так как исправить это, чтобы сделать только один запрос на одну прокрутку (страницу)

1 Ответ

0 голосов
/ 11 апреля 2020

У меня была такая же проблема. Чтобы решить эту проблему, вы должны удалить обратный вызов _onScroll из ScrollController, когда вы ждете ответа. После этого, когда данные получены, вы должны снова добавить их в свой ScrollController. ваш метод _onScroll должен измениться так:

void _onScroll() {
  final maxScroll = _scrollController.position.maxScrollExtent;
  final currentScroll = _scrollController.position.pixels;
  if (maxScroll - currentScroll <= _scrollThreshold) {
    _scrollController.removeListener(_onScroll);
    BlocProvider.of<SearchBloc>(context).add(SearchPosts(
      pageNo: _pageNo++,
      query: _searchText.text
    ));
  }
}

и не забудьте добавить его снова, когда ваши данные будут получены. Однако я понял, что этот метод можно вызывать дважды, когда пользователь быстро прокручивает. Для исправления этого я использовал RxDart в классе blo c и переопределил его метод transformEvents примерно так:

  @override
  Stream<S> transformEvents(
      Stream<E> events, Stream<S> Function(E) next) {
    return super.transformEvents(
      events.debounceTime(
        Duration(milliseconds: 300),
      ),
      next,
    );
  }

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...