En Dart, los Extension Methods permiten agregar nuevas funcionalidades a clases existentes sin modificar su código original. Esta funcionalidad es especialmente útil cuando deseas añadir métodos a clases de bibliotecas externas, facilitando el enriquecimiento de las APIs sin herencia o envolturas adicionales.
Los Extension Methods en Dart te permiten definir métodos adicionales para cualquier tipo, ya sea un tipo propio o uno de una biblioteca. La sintaxis utiliza la palabra clave extension
seguida del nombre de la extensión y la declaración de los métodos. Esto ofrece una forma segura y estructurada de extender clases con métodos específicos y personalizados.
Para crear un método de extensión, usa la palabra clave extension
, define un nombre para la extensión, y especifica el tipo que deseas extender.
extension StringExtension on String {
String capitalizarPrimeraLetra() {
return this[0].toUpperCase() + this.substring(1);
}
}
En este ejemplo, se agrega el método capitalizarPrimeraLetra
a la clase String
, que transforma la primera letra en mayúscula.
Este ejemplo amplía la clase String
con un método para contar las palabras de una cadena.
extension ContadorDePalabras on String {
int contarPalabras() {
return this.trim().split(RegExp(r'\s+')).length;
}
}
void main() {
String frase = "Hola, este es un ejemplo de extensión";
print("Número de palabras: ${frase.contarPalabras()}");
}
Puedes crear métodos para tipos numéricos como int
y double
:
extension OperacionesEntero on int {
int cuadrado() => this * this;
bool esPar() => this % 2 == 0;
}
void main() {
int numero = 5;
print("Cuadrado de $numero: ${numero.cuadrado()}"); // Imprime: Cuadrado de 5: 25
print("¿$numero es par? ${numero.esPar()}"); // Imprime: ¿5 es par? false
}
En este ejemplo, se agregan los métodos cuadrado
y esPar
a la clase int
.
Si estás usando bibliotecas externas, puedes agregarles métodos de utilidad sin modificar la biblioteca.
import 'dart:math';
extension RadianesExtension on num {
double aRadianes() => this * (pi / 180);
}
void main() {
double grados = 90;
print("90 grados en radianes: ${grados.aRadianes()}");
}
Este ejemplo extiende el tipo num
con un método que convierte grados a radianes.
Las extensiones también pueden definirse sin un nombre específico, lo cual es útil cuando solo necesitas usar la extensión en un archivo específico y no planeas reutilizarla en otros lugares.
extension on List<int> {
int sumaTotal() => this.reduce((a, b) => a + b);
}
void main() {
List<int> numeros = [1, 2, 3, 4, 5];
print("Suma total: ${numeros.sumaTotal()}"); // Imprime: Suma total: 15
}
Para más detalles, puedes consultar la documentación oficial de Dart sobre Extension Methods.
Jorge García
Fullstack developer