Tabla de Contenido
Introducción
En las aplicaciones móviles es muy común mostrar datos en listas, para suplir este patrón Flutter brinda un widget que es muy utilizado para estos casos, es el ListView.
ListView
Es muy sencillo se utilizar para manejar listas. Es el widget de desplazamiento más utilizado. Muestra los widgets uno tras otro.
Constructores
ListVieweste constructor toma una lista de widgets con un tamaño fijo. Es recomendable usarlo para listas que contengan pocos elementos.ListView.buildereste constructor sirve para generar elementos bajo demanda. Es recomendado para usar con listas grandes o infinitas porque solo llama al constructor para los elementos que realmente se van a ver.ListView.separatedutiliza dos buildersitemBuildercrea elementos a pedido yseparatorBuildercrea elementos que separan un widget de otro. Se recomienda usar cuando tenemos un número fijo de elementos.ListView.customutiliza unSliverChildDelegate, que permite personalizar aspectos adicionales de los widgets hijos.
Propiedades
Veremos algunas de las propiedades más utilizadas en los ListView.
keyidentificador del widget.scrollDirectionEs el sentido o dirección del scroll (desplazamiento), por defecto es de Vertical, pero se puede colocar horizontal también.reversecambia la forma en que se muestran los widgets, por defecto esfalsey es de arriba — abajo, si se colocatruequeda de abajo — arriba. Lo mismo pasa cuando elscrollDirectiones horizontal:true(izquierda — derecha) yfalse(derecha — izquierda).controllerse puede utilizar para controlar la posición de desplazamiento delListView.shrinkWrapse se coloca en true, limita el espacio de movimiento delListViewsolo al que ocupan los widgets hijos, es decir, si tenemos dos widgets el desplazamiento será solo hasta el segundo no se extiende más de allí.paddingespacio para agregar los widgets.itemExtendSi no es nulo, obliga a los hijos a tener la extensión dada en la dirección de desplazamiento.itemExtendBuilderSi no es nulo, obliga a los hijos a que el constructor devuelva la extensión correspondiente.itemBuilderes requerido por los constructoresListView.builderyListView.separatedpara construir los elementos hijos.itemCountusado por el contructorListView.builderva la cantidad de elementos que tendrá elListView. Y es requerido para el constructorListView.separated.separatorBuilderes requerido por el constructorListView.separated, agrega un separador por widget.childrenDelegatecomo vimos antes es unSliverChildDelegatey es requerido por el constructorListViewCustom. Este delegate proporciona los elementos secundarios.prototypeItemSi no es nulo, obliga a los widgets hijos a tener la misma extensión que el widget dado en la dirección de desplazamiento.childrenpropiedad utilizada solo por el constructorListViewallí va la lista de widgets hijos.
Ejemplo ListView
class ListViewWidget extends StatelessWidget {
const ListViewWidget({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView(
key: GlobalKey(),
scrollDirection: Axis.vertical, // por defecto es vertical
padding: const EdgeInsets.all(8.0),
children: [
// agregamos este espacio para que los widget empiecen abajo
// del área de configuraciones del dispositivo
const SizedBox(
height: 50,
),
Container(
height: 80,
color: Colors.green[500],
child: const Center(child: Text('Widget A')),
),
Container(
height: 70,
color: Colors.green[400],
child: const Center(child: Text('Widget B')),
),
Container(
height: 60,
color: Colors.green[300],
child: const Center(child: Text('Widget C')),
),
Container(
height: 50,
color: Colors.green[200],
child: const Center(child: Text('Widget D')),
),
],
),
);
}
}

Ejemplo ListView.builder
class ListViewBuilderWidget extends StatelessWidget {
const ListViewBuilderWidget({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView.builder(
itemCount: list.length,
itemBuilder: (context, index) {
return Container(
padding: const EdgeInsets.all(8.0),
decoration: BoxDecoration(
color: Colors.blue[300],
border: Border.all(width: 0.5),
borderRadius: BorderRadius.circular(8),
),
child: Text('Widget ${index + 1} '));
},
),
);
}
}

Ejemplo ListView.separated
class ListViewSeparatedWidget extends StatelessWidget {
const ListViewSeparatedWidget({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView.separated(
itemBuilder: (context, index) {
return Container(
color: Colors.yellow,
child: Text('Widget $index'),
);
},
separatorBuilder: (context, index) => const Divider(
color: Colors.purple,
),
itemCount: list.length),
);
}
}

Conclusión
El ListView es un widget de mucha utilidad para los desplazamientos no solo verticales aunque es lo más usado, sino también horizontales configurando la propiedad scrollDirection. Aunque para horizontales hay otros widgets más recomendados.
¡Gracias por leer!
