¿Cuál es la diferencia entre `ListView(children: [...])` y `ListView.builder`, y por qué importa?
Ver respuesta — intenta responderla en voz alta primero
ListView con children construye todos los elementos de una vez, aunque no se vean en pantalla. ListView.builder construye los elementos bajo demanda (solo los visibles y algunos cercanos), reutilizándolos al hacer scroll. Para listas largas o de tamaño desconocido, siempre usa ListView.builder; es mucho más eficiente en memoria y rendimiento.
ListView(children: [...]): le pasas una lista fija de widgets ya creados. Flutter los instancia todos. Está bien para pocas cosas (5-10 elementos fijos).ListView.builder: le das unitemCounty unitemBuilderque crea cada elemento cuando hace falta. Flutter solo construye los que están (o están por estar) en pantalla, y recicla los que salen. Esto se llama lazy loading.
Si tienes 10.000 elementos y usas la primera forma, creas 10.000 widgets de golpe: la app consume mucha memoria y puede trabarse. Con builder, solo existen los visibles.
import 'package:flutter/material.dart';
// Mal para listas largas: crea TODOS los items de una vez
class ListaFija extends StatelessWidget {
const ListaFija({super.key});
@override
Widget build(BuildContext context) {
return ListView(
children: const [
ListTile(title: Text("Item 1")),
ListTile(title: Text("Item 2")),
ListTile(title: Text("Item 3")),
],
);
}
}
// Bien para listas largas: crea items bajo demanda
class ListaGrande extends StatelessWidget {
final List<String> items;
const ListaGrande({super.key, required this.items});
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
// Solo se llama para los items visibles (y algunos cercanos)
return ListTile(title: Text(items[index]));
},
);
}
}
Usar ListView(children: ...) con una lista larga generada por un map o un for. Aunque funcione, construye todo de golpe y desperdicia memoria. Otro error relacionado: meter un ListView dentro de una Column sin acotar su altura, lo que provoca errores de layout ("unbounded height"); ahí conviene envolverlo en Expanded o usar shrinkWrap.
"
ListViewconchildrencrea todos los elementos de una vez, sirve solo para listas cortas y fijas.ListView.builderlos crea bajo demanda conitemCounteitemBuilder: Flutter construye solo los visibles y recicla los que salen de pantalla, que es lazy loading. Para listas largas o de tamaño desconocido siempre usobuilder, porque con la otra forma una lista de miles de elementos consumiría muchísima memoria y trabaría la app."
Tienes que mostrar una lista de 5.000 productos que vienen de una API. ¿Qué widget usas y por qué?
Ver respuesta
ListView.builder. Con 5.000 elementos, ListView(children: ...) crearía los 5.000 widgets de golpe, gastando mucha memoria y arriesgando jank. ListView.builder solo construye los que están en pantalla (y unos pocos alrededor), reciclándolos al hacer scroll, así que el consumo se mantiene bajo sin importar cuántos productos haya.