¿Qué son las Unions en Dart?
Mediante las Unions en Dart podemos verificar subtipos de una forma más sostenible a lo largo de nuestro código. Para ello utilizamos el operador «is». Esto se utiliza en muchas áreas como la gestión de estados. Te lo explico con un ejemplo en el vídeo.
Antes de aprender las union en Dart es importante que sepas qué es un enum pues podría decirse que los enum son un concepto más básico de las union class, y una buena base para conocer y sobre todo comprender de qué va todo esto y su utilidad (que es enorme!!). Vamos despacio y lo comprenderás todo.
💻👉 Código de los ejemplos: al final de la página.
Los enum son un tipo especial de clase utilizada para representar un número fijo de valores constantes. Por ejemplo, si tenemos un animal, en este ejemplo indicamos que puede ser alguno de estos tres tipos animales:
enum Animal {tigre, leon, foca}
Para crear una instancia de Animal lo hacemos de la siguiente forma:
final miAnimal = Animal.tigre;

Podemos decir que con los enum acotamos un cierto número de posibilidades, como por ejemplo un tipo de rol de usuario o un tipo de configuración. Tal vez hayas visto algo parecido a esto en otro lenguaje:
enum User {admin, user}
El problema es que con los enum se nos restringe a guardar información o un estado de dicha información. Con las union podemos instanciar las distintas posibilidades y sus diferentes propiedades y métodos. Vaya, esto se pone interesante. ¿eh?
Nos permiten representar una herencia limitada a las clases que definamos, cerrando la posibilidad que terceros puedan extenderla, así que tenemos un conjunto de subclases o hijos de nuestra clase definida. Ya sabes, memoriza este concepto, clases padre y clases hijo.
Además, con las union podemos restringir la herencia de la interfaz. Sí, restringir. A diferencia de crear una interfaz o clase abstracta, las unions nos permite restringir la herencia de la interfaz, permitiendo que terceros no puedan heredar de la interfaz. Con las union en Dart podemos permitir que terceros no puedan heredar de la clase padre.
Podemos decir que las Freezed Unions son lo contrario de las Freezed Data Classes.
Paquetes que necesitamos instalar
Para poder usarlas, necesitamos añadir varios paquetes a nuestro proyecto. Uno de ellos es build_runner. Este es el encargado de generar código automáticamente. Miremos el contenido de pubspec.yaml del proyecto. Aquí te dejo los enlaces de descarga para los paquetes para usar las freezed unions en dart:

Si tienes algún problema al guardar el pubspec.yaml porque no instala los paquetes, ejecuta el siguiente comando en la terminal de Visual Studio, dentro de la carpeta del proyecto, claro:
flutter packages get
Creación de una Freezed Union
Para crear la clase usamos la palabra funion, que nos crea el snippet (te dejo los snippets de funion y ptf más abajo para que los añadas a Visual Studio).


Para que el código se genere de forma automática, debemos ejecutar el siguiente comando en la terminal. Recuerda haber guardado los cambios antes de ejecutar el comando.
flutter run build_runner watch --delete-conflicting-outputs
Si queremos que ejecutar sólo una vez ponemos build en lugar de watch. No olvidar de incluir el part con la ayuda de ptf. Esto hay que hacerlo antes de ejecutar build_runner, de lo contrario no funciona.

Ejemplo del Union en Dart ya terminado
Veamos el ejemplo una vez terminado.

¿Por qué usarlas?
El operador is es muy poderoso a la hora de comprobar si algo es de un cierto tipo, pero como puedes ver en el vídeo, si añadimos tipos a «algo», después debemos asegurarnos que algo es de ese cierto tipo a lo largo de todo el programa. Si usamos las freezed union no tendremos ese problema. La aplicación se encargará sola de indicarnos que no hemos comprobado ese tipo en tiempo de desarrollo. Lo entenderás rápido si ves el vídeo del inicio de este artículo.
Es una de las grandes ventajas de usarlas.
Código del ejemplo
Aquí te puedes descargar el código del ejemplo.
Snippets que uso para las Union Class
Estos son los snippets que te he indicado antes y te ahorrarán mucho trabajo y tiempo. Recuerda añadirlos al archivo dart.json, que puedes encontrar en :

Para crear la clase:
"Freezed Union": {
"prefix": "funion",
"body": [
"@freezed",
"class ${1:Union} with _$${1:Union} {",
" const ${1:Union}._();",
" const factory ${1:Union}.${2}(${4}) = ${3};",
"}"
],
"description": "Freezed Union"
},
Para crear el part:
"Part 'Freezed' statement": {
"prefix": "ptf",
"body": [
"part '${TM_FILENAME_BASE}.freezed.dart';",
],
"description": "Creates a filled-in freezed part statement"
},
Deja una respuesta