ScrollController, как я могу определить начало, остановку и прокрутку прокрутки?

Я использую ScrollController для SingleChildScrollView виджет, где я хочу обнаружить, когда прокрутка начала, конца / остановки и все еще прокрутки?

Как я могу обнаружить, я использую Listene

scrollController = ScrollController()
      ..addListener(() {
        scrollOffset = _scrollController.offset;
      });

Также попробуйте с _scrollController.position.activity.velocity но не помог мне

Также есть

_scrollController.position.didEndScroll();
_scrollController.position.didStartScroll();

Но как я могу это использовать?

6 ответов

Решение

По этой ссылке https://medium.com/@diegoveloper/flutter-lets-know-the-scrollcontroller-and-scrollnotification-652b2685a4ac

Просто оберните SingleChildScrollView в NotificationListener и обновите свой код как..

NotificationListener<ScrollNotification>(
                onNotification: (scrollNotification) {
                  if (scrollNotification is ScrollStartNotification) {
                    _onStartScroll(scrollNotification.metrics);
                  } else if (scrollNotification is ScrollUpdateNotification) {
                    _onUpdateScroll(scrollNotification.metrics);
                  } else if (scrollNotification is ScrollEndNotification) {
                    _onEndScroll(scrollNotification.metrics);
                  }
                },
                child: SingleChildScrollView(
                /// YOUR OWN CODE HERE
               )
)

И просто объявить метод как

_onStartScroll(ScrollMetrics metrics) {
    print("Scroll Start");
  }

  _onUpdateScroll(ScrollMetrics metrics) {
    print("Scroll Update");
  }

  _onEndScroll(ScrollMetrics metrics) {
    print("Scroll End");
  }

Вы будете уведомлены определенным способом.

Нет необходимости в NotificationListener, мы можем использовать для этого только контроллер прокрутки.

Сначала зарегистрируйте обратный вызов пост-кадра, используя WidgetsBinding.instance.addPostFrameCallbackчтобы убедиться, что к этому моменту контроллер прокрутки уже связан с представлением прокрутки. Мы настроим слушателя в этом обратном вызове.

Для прослушивания прокручиваемого обновления мы можем использовать scrollController.addListener.

Для прослушивания начала и остановки прокрутки мы можем использовать bgScrollCtrl.position.isScrollingNotifier.addListener. Вы можете проверить код ниже:

WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
      scrollCtrl.addListener(() { 
        print('scrolling');
      });
      scrollCtrl.position.isScrollingNotifier.addListener(() { 
        if(!scrollCtrl.position.isScrollingNotifier.value) {
          print('scroll is stopped');
        } else {
          print('scroll is started');
        }
      });
    });
_scrollController.position.pixels

if(_scrollController.position.pixels == _scrollController.position.maxScrollExtent){
//scroll end
}

чтобы использовать их, вы должны добавить слушателя к вашему scrollview

NotificationListner не работает для меня, потому что я анимирую прокрутку. Когда я касаюсь его, вызывается ScrollEndNotification.

Итак, чтобы обнаружить прокрутку, достигните нижней или верхней части. Я добавил Listner в scrollcontroller.

  _scrollController.addListener(_scrollListener);

  _scrollListener() {
    if (_scrollController.offset >= _scrollController.position.maxScrollExtent &&
        !_scrollController.position.outOfRange) {
      setState(() {
        debugPrint("reach the top");
      });
    }
    if (_scrollController.offset <= _scrollController.position.minScrollExtent &&
        !_scrollController.position.outOfRange) {
      setState(() {
        debugPrint("reach the top");
      });
    }
  }

Вы можете использовать _scrollController.position.pixels для позиции прокрутки gettig и addlistener, чтобы получать уведомления об изменениях

if(_scrollController.position.pixels == _scrollController.position.maxScrollExtent){// для конца прокрутки}

if(_scrollController.position.pixels == _scrollController.position.minScrollExtent){// для прокрутки вверху}

Для этого варианта использования есть пакет. scroll_edge_listener

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

      ScrollEdgeListener(
  edge: ScrollEdge.end,
  edgeOffset: 400,
  continuous: false,
  debounce: const Duration(milliseconds: 500),
  dispatch: true,
  listener: () {
    debugPrint('listener called');
  },
  child: ListView(
    children: const [
      Placeholder(),
      Placeholder(),
      Placeholder(),
      Placeholder(),
    ],
  ),
),

Другие вопросы по тегам