fix(favoritos): use the cross-version onReorder API and correct drag index math
The CI Flutter SDK predates v3.41 and only exposes ReorderableListView's onReorder; the newer onReorderItem broke the build with three analyzer errors. onReorder exists in both SDKs, so use it and compensate for its pre-removal newIndex internally. Fixing the call site surfaced a real ordering bug: _onReorder located the target neighbour in the untrimmed global list, while ServicioFavoritos .reordenar inserts into the list after the station is removed. Dragging a station downwards past its neighbours therefore landed it one slot too far. Adds a mid-list downward-drag test, the only case that separates the two coordinate spaces.
This commit is contained in:
@@ -58,23 +58,35 @@ class _PantallaFavoritosState extends State<PantallaFavoritos> {
|
||||
/// global position [EstadoRadio.reordenarFavorito] expects, so a drag
|
||||
/// while a group chip is active still produces a coherent global order
|
||||
/// (other groups' relative order is left untouched).
|
||||
///
|
||||
/// [newIndex] arrives in `ReorderableListView.onReorder`'s pre-removal
|
||||
/// coordinate space: dragging downwards reports the slot the row would
|
||||
/// occupy while it is still in the list. The logic below indexes into the
|
||||
/// list AFTER the row is removed, so shift by one in that direction first.
|
||||
void _onReorder(
|
||||
List<Emisora> filtrados,
|
||||
List<Emisora> favoritos,
|
||||
int oldIndex,
|
||||
int newIndex,
|
||||
) {
|
||||
if (newIndex > oldIndex) newIndex -= 1;
|
||||
final movido = filtrados[oldIndex];
|
||||
final restantes = List<Emisora>.from(filtrados)..removeAt(oldIndex);
|
||||
// `ServicioFavoritos.reordenar` removes the station first and THEN
|
||||
// inserts at the index it is given, so the target index must be
|
||||
// expressed in the global list WITHOUT the moved station. Locating the
|
||||
// neighbour in the untrimmed list instead drifts by one whenever the
|
||||
// moved station sits before it.
|
||||
final globalSinMovido =
|
||||
favoritos.where((e) => e.uuid != movido.uuid).toList();
|
||||
final int nuevoIndiceGlobal;
|
||||
if (restantes.isEmpty) {
|
||||
nuevoIndiceGlobal = favoritos.length - 1;
|
||||
nuevoIndiceGlobal = globalSinMovido.length;
|
||||
} else if (newIndex >= restantes.length) {
|
||||
nuevoIndiceGlobal = favoritos.indexWhere(
|
||||
(e) => e.uuid == restantes.last.uuid,
|
||||
);
|
||||
nuevoIndiceGlobal =
|
||||
globalSinMovido.indexWhere((e) => e.uuid == restantes.last.uuid) + 1;
|
||||
} else {
|
||||
nuevoIndiceGlobal = favoritos.indexWhere(
|
||||
nuevoIndiceGlobal = globalSinMovido.indexWhere(
|
||||
(e) => e.uuid == restantes[newIndex].uuid,
|
||||
);
|
||||
}
|
||||
@@ -217,7 +229,7 @@ class _PantallaFavoritosState extends State<PantallaFavoritos> {
|
||||
onTap: _abrirFormularioEmisoraPersonalizada,
|
||||
),
|
||||
),
|
||||
onReorderItem:
|
||||
onReorder:
|
||||
(oldIndex, newIndex) =>
|
||||
_onReorder(filtrados, favoritos, oldIndex, newIndex),
|
||||
children: [
|
||||
|
||||
Reference in New Issue
Block a user