Saltar al contenido principal

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.

dart
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.

dart
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:

dart
ReorderableListView(
  onReorder: (int oldIndex, int newIndex) {
    if (oldIndex < newIndex) {
      newIndex -= 1;
    }

    // Handle reorder ...
  }
)

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

dart
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:

dart
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:

dart
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:

PRs relevantes: