Todo el problema se debía que en la clase _NoteSliverState
le estaba pasando una clave
(Key
) que no era única, al contrario de lo que pensaba.
Cuando se reciclan Widgets, como es el caso de una tabla, la clave que identifica al Widget ha
de ser única, para evitar que el Widget sea reutilizado donde no se debe. Algo parecido a lo que ocurre
en iOS también con el cellId
.
En nuestro caso concreto que ocurría era lo siguiente:
- Se eliminaba una nota del modelo, dentro de
onDismissed
, lo cual también elimina la vista (NoteSliver
así como su estado.) - El modelo avisaba al Widget de Notas (
NotesListView
), que procede a llamar a su funciónbuild
, lo cual reconstruye losNoteSliver
s, reciclando en la medida de lo posible. - Al reciclar, Flutter se encontraba con una
NoteSliver
que tiene la mismaKey
que la qu efue eliminada (por que laKey
proporcionada no era única). Daba por hehco que ésta era la que tendría que haber sido eliminada, y se arma la de Dios.
Al modificar el código de build
de _NoteSliverState
usando un UniqueKey
, se resuelve el problema:
@override
Widget build(BuildContext context) {
DateFormat fmt = DateFormat("yyyy-mm-dd");
return Dismissible(
key: UniqueKey(),
Consta de dos partes, la primera obligatoria, y la segunda opcional (para aquellos que quieran seguir con Flutter).
- Repasa el código actual de Everpobre y asegúrate de entender lo que hace.
- Crea una clase
Notebooks
en el dominio. Representa una lista deNotebook
. - Añádele un construictor que carga datos de pruebas: varios
Notebooks
que contienen a variasNotes
. - Crea un Widget de tipo
ListView
para mostrarlos. - Se debe de poder crear nuevos
Notebooks
mediante unFloatingActionButton
y eliminarlos mediante unDismissable
. - Crea dos rutas que permiten navegar desde el Grid de Notebooks a la lista de Notes que contiene dicho
Notebook
.
- Crea un Widget de detalle de Note que permita editar su contenido.
- Mira la documentación de
EditableText
para ver como implementar texto editable (es muy similar a iOS).