es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Flutter: Mantener scrollOffset al agregar nuevos elementos a la lista.

Tengo un CustomScrollView y en él dos SliverList, esto se debe a que cuando desplazo hacia arriba y descargo nuevos elementos en la lista, estos nuevos elementos se agregan a la lista superior y se mantiene el desplazamiento en la lista inferior (manteniéndose en la parte superior de la lista inferior) porque CustomScrollView tiene el centro en la lista inferior.

Estoy usando bloc alrededor de la vista de desplazamiento personalizada para los elementos que estoy representando.
El problema es que cuando descargo nuevos elementos en segundo plano y la persona se desplaza en la segunda lista, inmediatamente se desplaza hacia la parte superior de esa segunda lista. No quiero eso, quiero mantenerlo en su posición de desplazamiento y simplemente informarle “Oye, hay nueva información en la parte superior”.

CustomScrollView(
        center: _mainListKey,
        controller: widget.scrollController,
        physics: const AlwaysScrollableScrollPhysics(),
        slivers: [
          SliverList(
            delegate: SliverChildBuilderDelegate(
              (BuildContext context, int index) => NewElement(),
              childCount: newElements?.length ?? 0,
            ),
          ),
          SliverList(
            key: _mainListKey,
            delegate: SliverChildBuilderDelegate(
              (BuildContext context, int index) => OldElement(),
              childCount: oldElements.length,
            ),
          ),
        ],
      ),
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para resolver el problema de que la persona sea desplazada al inicio de la segunda lista cuando se agregan nuevos elementos al inicio de la primera lista, se puede usar el ScrollController para obtener la posición actual de la persona y luego volver a establecerla en esa posición después de agregar los nuevos elementos.

    Para hacer esto, primero debemos declarar un ScrollController y asignarlo a nuestra CustomScrollView en el parámetro controller. Luego, cuando agreguemos nuevos elementos a la primera lista, podemos usar la propiedad position del ScrollController para obtener la posición actual de la persona. Luego podemos agregar los nuevos elementos y finalmente usar el método jumpTo del ScrollController para volver a establecer la posición en lo que era antes.

    Aquí hay un ejemplo de implementación:

    final ScrollController _scrollController = ScrollController();
    
    CustomScrollView(
      center: _mainListKey,
      controller: _scrollController,
      physics: const AlwaysScrollableScrollPhysics(),
      slivers: [
        SliverList(
          delegate: SliverChildBuilderDelegate(
            (BuildContext context, int index) => NewElement(),
            childCount: newElements?.length ?? 0,
          ),
        ),
        SliverList(
          key: _mainListKey,
          delegate: SliverChildBuilderDelegate(
            (BuildContext context, int index) => OldElement(),
            childCount: oldElements.length,
          ),
        ),
      ],
    ),
    
    // Cuando se agregan nuevos elementos:
    var initialPosition = _scrollController.position.pixels;
    // agregar nuevos elementos a la primera lista
    _scrollController.jumpTo(initialPosition); // volver a establecer la posición en lo que era antes
    

    Esto debería mantener la posición de la persona en la segunda lista y simplemente informarles sobre la nueva información en la parte superior.

Comments are closed.