Estoy usando ScrollController para el widget SingleChildScrollView donde quiero detectar cuándo se inicia, finaliza / detiene el desplazamiento y aún se desplaza.

¿Cómo puedo detectar? Estoy usando Listene

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

Prueba también con _scrollController.position.activity.velocity pero no me ayudó.

También hay

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

¿Pero cómo puedo usarlo?

6
Govaadiyo 10 may. 2019 a las 09:13

3 respuestas

La mejor respuesta

Desde este enlace https://medium.com/@diegoveloper/ flutter-lets-know-the-scrollcontroller-and-scrollnotification-652b2685a4ac

Simplemente envuelva su SingleChildScrollView a NotificationListener y actualice su código como ...

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
               )
)

Y solo declara un método como

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

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

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

Se le notificará por un método particular.

3
iPatel 10 may. 2019 a las 07:26

NotificationListner no funciona para mí porque animo scrollview. Cuando lo toco, se llama a ScrollEndNotification .

Entonces, para detectar el desplazamiento de la vista inferior o superior. Agregué Listener a 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");
      });
    }
  }
0
Abdullah Khan 22 ene. 2020 a las 08:40
_scrollController.position.pixels

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

Para usarlos, debe agregar un oyente a su vista de desplazamiento

0
Murat Aslan 10 may. 2019 a las 06:18