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, oCupertinoScrollBehaviorpara modificar el comportamiento predeterminado, anulandoScrollBehavior.dragDevices.- Con tu propio
ScrollBehavior, puedes aplicarlo a nivel de toda la aplicación configurandoMaterialApp.scrollBehavioroCupertinoApp.scrollBehavior. - O, si deseas aplicarlo solo a widgets específicos, agrega una
ScrollConfigurationencima del widget en cuestión con tuScrollBehaviorpersonalizado.
- Con tu propio
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 existingScrollBehavior, and set differentdragDevices.- Crea una
ScrollConfigurationen tu árbol de widgets y proporciona una copia modificada delScrollBehaviorexistente en el contexto actual usandocopyWith.
- Crea una
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:
MaterialApp(
// ...
);
Código después de la migración:
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:
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:
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:
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:
// 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:
VerticalDragGestureRecognizer(
kind: PointerDeviceKind.touch,
);
Código después de la migración:
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:
-
ScrollConfiguration -
ScrollBehavior -
MaterialScrollBehavior -
CupertinoScrollBehavior -
PointerDeviceKind -
GestureDetector
Problema relevante:
PRs relevantes:
A menos que se indique lo contrario, la documentación de este sitio refleja Flutter 3.44.0. Página actualizada por última vez el 2026-05-05. Ver código fuente oreportar un problema.