En Dart, Expando
es una clase que permite asociar datos adicionales a objetos sin modificar su clase o estructura. Funciona como un mapa, pero en lugar de almacenar valores de forma explícita, asocia dinámicamente propiedades o valores adicionales a instancias específicas. Expando
es útil cuando necesitas agregar datos a un objeto temporalmente sin cambiar su definición o si trabajas con objetos de una biblioteca externa.
Expando
es una clase que proporciona una forma de agregar datos a objetos sin la necesidad de modificar su clase original. Cada Expando
actúa como una propiedad dinámica, permitiendo almacenar y recuperar valores asociados a objetos. Solo los objetos de referencia (como clases) pueden ser utilizados con Expando
; no se pueden asociar valores a tipos primitivos como int
o double
.
Para usar Expando
, declara una variable de tipo Expando<T>
, donde T
es el tipo de dato que quieres asociar al objeto. Luego, puedes asignar y recuperar valores usando la instancia del objeto como clave.
Expando<String> alias = Expando<String>();
class Persona {
final String nombre;
Persona(this.nombre);
}
void main() {
Persona p = Persona("Carlos");
alias[p] = "Alias de Carlos";
print(alias[p]); // Imprime: Alias de Carlos
}
En este ejemplo, alias
es un Expando
que permite asociar un nombre alternativo a la instancia de Persona
sin modificar la clase.
Supongamos que tienes una clase Usuario
a la que deseas agregar datos temporales como un "nivel de acceso". Puedes usar Expando
para asociar esta propiedad sin cambiar la clase.
Expando<int> nivelDeAcceso = Expando<int>();
class Usuario {
final String nombre;
Usuario(this.nombre);
}
void main() {
Usuario usuario1 = Usuario("Ana");
Usuario usuario2 = Usuario("Luis");
nivelDeAcceso[usuario1] = 3;
nivelDeAcceso[usuario2] = 5;
print("Nivel de acceso de ${usuario1.nombre}: ${nivelDeAcceso[usuario1]}"); // Imprime: Nivel de acceso de Ana: 3
print("Nivel de acceso de ${usuario2.nombre}: ${nivelDeAcceso[usuario2]}"); // Imprime: Nivel de acceso de Luis: 5
}
Expando
es especialmente útil cuando trabajas con objetos de una biblioteca externa que no puedes modificar directamente.
Expando<String> etiqueta = Expando<String>();
class Elemento {
final String id;
Elemento(this.id);
}
void main() {
Elemento elemento = Elemento("E-12345");
etiqueta[elemento] = "Elemento importante";
print("Etiqueta del elemento ${elemento.id}: ${etiqueta[elemento]}"); // Imprime: Elemento importante
}
Aquí, etiqueta
almacena información adicional sin modificar la estructura de Elemento
.
Expando
puede utilizarse para asociar datos calculados a objetos y así evitar cálculos repetidos, actuando como un caché.
Expando<int> resultadoExpensivoCache = Expando<int>();
class Calculo {
int operacionExpensiva(int valor) {
return valor * 10; // Simulación de una operación costosa
}
}
void main() {
Calculo calculo = Calculo();
int valor = 5;
if (resultadoExpensivoCache[calculo] == null) {
resultadoExpensivoCache[calculo] = calculo.operacionExpensiva(valor);
}
print("Resultado cacheado: ${resultadoExpensivoCache[calculo]}"); // Imprime: Resultado cacheado: 50
}
En este ejemplo, la operación costosa solo se realiza una vez y su resultado se almacena en Expando
para acceso rápido.
Para más detalles, consulta la documentación oficial de Dart sobre Expando.
Jorge García
Fullstack developer