Volver a la página principal
jueves 31 octubre 2024
13

Cómo usar Expando en Dart

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.

¿Qué es Expando en Dart?

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.

Sintaxis básica de Expando

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.

Ejemplos de uso de Expando en Dart

Asociar datos adicionales a objetos

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
}

Uso de Expando para agregar datos en objetos externos

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.

Uso de Expando para gestión de caché

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.

Ventajas de usar Expando en Dart

  • Extensibilidad: Permite agregar datos a objetos sin modificar su estructura, lo cual es ideal para objetos de bibliotecas externas.
  • Flexibilidad: Facilita la asociación dinámica de datos adicionales solo cuando se necesitan.
  • Uso temporal de datos: Almacena valores que pueden ser desechados cuando el objeto ya no se usa, optimizando la gestión de datos.

Referencia oficial

Para más detalles, consulta la documentación oficial de Dart sobre Expando.

Etiquetas:
dart
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer