Saltar al contenido principal

Desplazamiento multitáctil predeterminado

Los ScrollBehaviors ahora configurarán cómo los Scrollables responden a los gestos multitáctiles.

Resumen

#

Los ScrollBehaviors ahora permiten o no que la velocidad de desplazamiento se vea afectada por el número de punteros en la pantalla. ScrollBehavior.multitouchDragStrategy, por defecto, evita que múltiples punteros interactuando con el scrollable al mismo tiempo afecten la velocidad de desplazamiento.

Contexto

#

Antes de este cambio, por cada puntero que arrastraba un Widget Scrollable, la velocidad de desplazamiento aumentaba. Esto no coincidía con las expectativas de la plataforma al interactuar con aplicaciones Flutter.

Ahora, el ScrollBehavior heredado gestiona cómo múltiples punteros afectan a los widgets de desplazamiento según lo especificado por ScrollBehavior.multitouchDragStrategy. Este enum, MultitouchDragStrategy, también se puede configurar para el comportamiento anterior.

Descripción del cambio

#

Este cambio solucionó la capacidad inesperada de aumentar las velocidades de desplazamiento al arrastrar con más de un dedo.

Si has dependido del comportamiento anterior en tu aplicación, existen varias formas de controlar y configurar esta función.

  • Extiende ScrollBehavior, MaterialScrollBehavior o CupertinoScrollBehavior para modificar el comportamiento predeterminado, sobrescribiendo ScrollBehavior.multitouchDragStrategy.

    • Con tu propio ScrollBehavior, puedes aplicarlo a nivel de toda la aplicación configurando MaterialApp.scrollBehavior o CupertinoApp.scrollBehavior.
    • O, si deseas aplicarlo solo a widgets específicos, agrega una ScrollConfiguration encima del widget en cuestión con tu ScrollBehavior personalizado.

Tus widgets desplazables luego heredan y reflejan este comportamiento.

  • Instead of creating your own ScrollBehavior, another option for changing the default behavior is to copy the existing ScrollBehavior, and set different multitouchDragStrategy.
    • Crea una ScrollConfiguration en tu árbol de widgets y proporciona una copia modificada del ScrollBehavior existente en el contexto actual usando copyWith.

Para adaptarse a la nueva configuración, DragGestureRecognizer también se actualizó para admitir MultitouchDragStrategy en otros contextos de arrastre.

Guía de migración

#

Establecer un ScrollBehavior personalizado para tu aplicación

#

Código antes de la migración:

dart
MaterialApp(
  // ...
);

Código después de la migración:

dart
class MyCustomScrollBehavior extends MaterialScrollBehavior {
  // Override behavior methods and getters like multitouchDragStrategy
  @override
  MultitouchDragStrategy getMultitouchDragStrategy(BuildContext context) => MultitouchDragStrategy.sumAllPointers;
}

// Set ScrollBehavior for an entire application.
MaterialApp(
  scrollBehavior: MyCustomScrollBehavior(),
  // ...
);

Establecer un ScrollBehavior personalizado para un widget específico

#

Código antes de la migración:

dart
final ScrollController controller = ScrollController();
ListView.builder(
  controller: controller,
  itemBuilder: (BuildContext context, int index) {
    return Text('Item $index');
  },
);

Código después de la migración:

dart
class MyCustomScrollBehavior extends MaterialScrollBehavior {
  // Override behavior methods and getters like multitouchDragStrategy
  @override
  MultitouchDragStrategy getMultitouchDragStrategy(BuildContext context) => MultitouchDragStrategy.sumAllPointers;
}

// ScrollBehavior can be set for a specific widget.
final ScrollController controller = ScrollController();
ScrollConfiguration(
  behavior: MyCustomScrollBehavior(),
  child: ListView.builder(
    controller: controller,
    itemBuilder: (BuildContext context, int index) {
      return Text('Item $index');
    },
  ),
);

Copiar y modificar un ScrollBehavior existente

#

Código antes de la migración:

dart
final ScrollController controller = ScrollController();
ListView.builder(
  controller: controller,
  itemBuilder: (BuildContext context, int index) {
    return Text('Item $index');
  },
);

Código después de la migración:

dart
// ScrollBehavior can be copied and adjusted.
final ScrollController controller = ScrollController();
ScrollConfiguration(
  behavior: ScrollConfiguration.of(context).copyWith(
    multitouchDragStrategy: MultitouchDragStrategy.sumAllPointers,
  ),
  child: ListView.builder(
    controller: controller,
    itemBuilder: (BuildContext context, int index) {
      return Text('Item $index');
    },
  ),
);

Timeline

#

Introducido en la versión: 3.18.0-4.0.pre
En la versión estable: 3.19.0

Referencias

#

Documentación de la API:

Problema relevante:

PRs relevantes: