Saltar al contenido principal

Dispositivos de desplazamiento por arrastre predeterminados

ScrollBehaviors ahora configurará qué PointerDeviceKinds pueden arrastrar Scrollables.

Resumen

#

Los ScrollBehavior ahora permiten o no el desplazamiento por arrastre desde PointerDeviceKinds específicos. ScrollBehavior.dragDevices, por defecto, permite que los widgets de desplazamiento sean arrastrados por todos los PointerDeviceKinds excepto por PointerDeviceKind.mouse.

Contexto

#

Antes de este cambio, todos los PointerDeviceKinds podían arrastrar un widget Scrollable. Esto no coincidía con las expectativas del desarrollador al interactuar con aplicaciones de Flutter utilizando dispositivos de entrada de mouse. Esto también dificultaba la ejecución de otros gestos del mouse, como seleccionar texto que estaba contenido en un widget Scrollable.

Ahora, el ScrollBehavior heredado gestiona qué dispositivos pueden arrastrar widgets de desplazamiento según lo especificado por ScrollBehavior.dragDevices. Se permite arrastrar a este conjunto de PointerDeviceKinds.

Descripción del cambio

#

Este cambio solucionó la capacidad inesperada de desplazarse arrastrando con un mouse.

Si has confiado en el comportamiento anterior en tu aplicación, existen varias formas de controlar y configurar esta característica.

  • Extiende ScrollBehavior, MaterialScrollBehavior, o CupertinoScrollBehavior para modificar el comportamiento predeterminado, anulando ScrollBehavior.dragDevices.

    • 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 dragDevices.
    • 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 de dispositivos de arrastre en ScrollBehavior, GestureDetector.kind se ha deprecado junto con todas las instancias de subclases del parámetro. Está disponible una solución de flutter para migrar el código existente de todos los detectores de gestos de kind a supportedDevices. El parámetro anterior kind solo permitía usar un PointerDeviceKind para filtrar gestos. La introducción de supportedDevices hace posible tener más de un PointerDeviceKind válido.

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 dragDevices
  @override
  Set<PointerDeviceKind> get dragDevices => {
    PointerDeviceKind.touch,
    PointerDeviceKind.mouse,
    // etc.
  };
}

// 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 dragDevices
  @override
  Set<PointerDeviceKind> get dragDevices => {
    PointerDeviceKind.touch,
    PointerDeviceKind.mouse,
    // etc.
  };
}

// 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(dragDevices: {
    PointerDeviceKind.touch,
    PointerDeviceKind.mouse,
  }),
  child: ListView.builder(
    controller: controller,
    itemBuilder: (BuildContext context, int index) {
     return Text('Item $index');
    }
  ),
);

Migrar GestureDetectors de kind a supportedDevices

#

Código antes de la migración:

dart
VerticalDragGestureRecognizer(
  kind: PointerDeviceKind.touch,
);

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

dart
VerticalDragGestureRecognizer(
  supportedDevices: <PointerDeviceKind>{ PointerDeviceKind.touch },
);

Timeline

#

Introducido en la versión: 2.3.0-12.0.pre
En la versión estable: 2.5

Referencias

#

Documentación de la API:

Problema relevante:

PRs relevantes: