Depreciar el callback onReorder
El callback onReorder ha sido depreciado en favor de un nuevo callback llamado onReorderItem.
Resumen
#El callback onReorder en los
widgets ReorderableListView, ReorderableListView.builder,
ReorderableList y SliverReorderableList
ha sido reemplazado por un nuevo callback, onReorderItem,
que proporciona un comportamiento más intuitivo para newIndex.
Contexto
#El callback onReorder en los
widgets ReorderableListView, ReorderableListView.builder,
ReorderableList y SliverReorderableList requería
una corrección manual para el segundo parámetro, newIndex,
en caso de que el oldIndex estuviera antes de newIndex porque
la lista de elementos se acortaría en un elemento.
void handleReorder(int oldIndex, int newIndex) {
if (oldIndex < newIndex) {
// Removing the item at oldIndex shortens the list by 1.
newIndex -= 1;
}
// Handle the actual reorder behavior...
}
ReorderableListView(
onReorder: handleReorder,
)
El nuevo callback, onReorderItem, resuelve este problema
haciendo la corrección de forma automática.
void handleReorder(int oldIndex, int newIndex) {
// Handle the actual reorder behavior...
}
ReorderableListView(
onReorderItem: handleReorder,
)
Guía de migración
#Los widgets ReorderableListView, ReorderableListView.builder,
ReorderableList y SliverReorderableList
comparten la misma lógica de reordenamiento.
Se aplican los mismos pasos de migración a cada uno de estos widgets.
Esta guía de migración usa ReorderableListView como ejemplo.
Caso 1: Callbacks simples
#Código antes de la migración:
ReorderableListView(
onReorder: (int oldIndex, int newIndex) {
if (oldIndex < newIndex) {
newIndex -= 1;
}
// Handle reorder ...
}
)
Código después de la migración:
ReorderableListView(
onReorder: (int oldIndex, int newIndex) {
if (oldIndex < newIndex) {
newIndex -= 1;
}
onReorderItem: (int oldIndex, int newIndex) {
// Handle reorder ...
}
)
Caso 2: Exclusión para implementaciones complejas de onReorder
#
En algunos casos, como cuando el callback proporcionado es complejo,
la migración al nuevo callback onReorderItem podría no ser obvia.
En estos casos, para excluirse del nuevo comportamiento,
ajusta el newIndex para que coincida con el comportamiento anterior.
Código antes de la migración:
void handleSomeComplexReorder(int oldIndex, int newIndex) {
// Handle reorder ...
}
ReorderableListView(
onReorder: (int oldIndex, int newIndex) {
handleSomeComplexReorder(oldIndex, newIndex);
}
)
Código después de la migración:
void handleSomeComplexReorder(int oldIndex, int newIndex) {
// Handle reorder ...
}
ReorderableListView(
onReorder: (int oldIndex, int newIndex) {
onReorderItem: (int oldIndex, int newIndex) {
// To get the equivalent of the old newIndex:
if (oldIndex < newIndex) {
newIndex += 1;
}
return handleSomeComplexReorder(oldIndex, newIndex);
}
)
Timeline
#Llegó en la versión: 3.41.0-1.0.pre-364
En la versión estable: 3.44
Referencias
#Documentación de la API:
Issues relevantes:
- El parámetro index para onReorderCallback de ReorderableListView es confuso
- El argumento newIndex de SliverReorderableList está desfasado por uno al arrastrar hacia abajo en la lista
PRs relevantes:
A menos que se indique lo contrario, la documentación en este sitio refleja Flutter 3.44.0. Página actualizada por última vez el 20-05-2026. Ver código fuente oreportar un problema.