dart - ListView no se actualiza mientras que la lista adjunta sí lo hace(Flutter)
(1)
Estoy tratando de familiarizarme con el aleteo y me enfrento a un caso extraño.
Quiero construir un
ListView
dinámico donde un botón
+
permite agregar elementos.
Escribí el siguiente código de estado:
class MyWidgetListState extends State<MyWidgetList> {
List<Widget> _objectList = <Widget>[
new Text(''test''),
new Text(''test'')
];
void _addOne() {
setState(() {
_objectList.add(new Text(''test''));
});
}
void _removeOne() {
setState(() {
_objectList.removeLast();
});
}
@override
Widget build(BuildContext context) {
return new Column(
children: <Widget>[
new ListView(
shrinkWrap: true,
children: _objectList
),
new Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new IconButton(
icon: new Icon(Icons.remove_circle),
iconSize: 36.0,
tooltip: ''Remove'',
onPressed: _objectList.length > 2 ? _removeOne : null,
),
new IconButton(
icon: new Icon(Icons.add_circle),
iconSize: 36.0,
tooltip: ''Add'',
onPressed: _addOne,
)
],
),
new Text(_objectList.length.toString())
],
);
}
}
Mi problema aquí es que el ListView está visualmente atascado con los 2 elementos con los que lo inicialicé.
Internamente, la
_objectList
está bien gestionada.
Para propósitos de prueba, agregué un widget de
Text
simple en la parte inferior que muestra el tamaño de la lista.
Este funciona bien cuando hago clic en los botones Agregar / Eliminar y se actualiza correctamente.
¿Me estoy perdiendo de algo?
Flutter se basa en datos inmutables. Lo que significa que si la referencia a un objeto no cambió, el contenido tampoco.
El problema es que, en su caso, siempre envía a
ListView
la misma matriz y, en cambio, muta su contenido.
Pero esto lleva a
ListView
asumiendo que la lista no cambió y, por lo tanto, evita el procesamiento inútil.
Puedes cambiar tu
setState
para tenerlo en cuenta:
setState(() {
_objectList = List.from(_objectList)
..add(Text("foo"));
});