tutorial start setup run new language español curso create course app dart flutter

dart - setup - flutter start



¿Qué son las claves en la clase de widgets sin estado? (2)

En los documentos de aleteo hay un código de muestra para una subclase de widget sin estado como se muestra:

class GreenFrog extends StatelessWidget { const GreenFrog({ Key key }) : super(key: key); @override Widget build(BuildContext context) { return new Container(color: const Color(0xFF2DBD3A)); } }

y esto

class Frog extends StatelessWidget { const Frog({ Key key, this.color: const Color(0xFF2DBD3A), this.child, }) : super(key: key); final Color color; final Widget child; @override Widget build(BuildContext context) { return new Container(color: color, child: child); } }

¿Qué es una clave y cuándo debería usarse este súper constructor? Parece que si tienes tu propio constructor debes tener {Clave de tecla} ¿por qué? He visto otros ejemplos en los que la súper palabra clave no se usa, de modo que aquí es donde está mi confusión.


La clave es un parámetro opcional necesario para preservar el estado en su árbol de widgets, debe usarlos si desea mover una colección de elementos en su árbol y preservar el estado de los mismos.

La mejor explicación se puede encontrar en este video de Google Cuándo usar las teclas - Flutter Widgets 101 Ep. 4


TLDR: Todos los widgets deben tener una Key key como parámetro opcional o su constructor. Key es algo que utiliza el motor de aleteo en el paso de reconocer qué widget en una lista ha cambiado.

Es útil cuando tiene una lista ( Column , Row , lo que sea) de widgets del mismo tipo que potencialmente se pueden eliminar / insertar.

Digamos que tienes esto (el código no funciona, pero entiendes la idea):

AnimatedList( children: [ Card(child: Text("foo")), Card(child: Text("bar")), Card(child: Text("42")), ] )

Potencialmente, puede eliminar cualquiera de estos widgets individualmente con un golpe.

La cosa es que nuestra lista tiene una animación cuando un niño es eliminado. Así que vamos a quitar "barra".

AnimatedList( children: [ Card(child: Text("foo")), Card(child: Text("42")), ] )

El problema: sin Key , flutter no podrá saber si el segundo elemento de tu Row desapareció. O si es el último que desapareció y el segundo cambia su hijo.

Por lo tanto, sin la Key , podría tener un error en el que su animación de salida se reproducirá en el último elemento.

Aquí es donde Key tiene lugar.

Si comenzamos nuestro ejemplo de nuevo, usando la tecla tendríamos esto:

AnimatedList( children: [ Card(key: ObjectKey("foo"), child: Text("foo")), Card(key: ObjectKey("bar"), child: Text("bar")), Card(key: ObjectKey("42"), child: Text("42")), ] )

observe cómo la clave no es el índice secundario, sino algo exclusivo del elemento.

A partir de este punto, si eliminamos nuevamente "barra", tendremos

AnimatedList( children: [ Card(key: ObjectKey("foo"), child: Text("foo")), Card(key: ObjectKey("42"), child: Text("42")), ] )

Gracias a que la key está presente, el motor de aleteo ahora sabe con seguridad qué widget se eliminó. Y ahora nuestra animación de salida se reproducirá correctamente en "bar" en lugar de "42".