En Dart, el tear-off permite hacer referencia directa a una función o método sin llamarlo. Con esta característica, puedes pasar funciones o métodos como parámetros sin tener que definir una función adicional. Esto simplifica el código y mejora la legibilidad al permitir la referencia directa a funciones, constructores y métodos.
Un tear-off es una forma de tomar una referencia de una función o método para que pueda ser utilizada como un parámetro de función o asignada a una variable. Esto se hace escribiendo solo el nombre de la función o método sin paréntesis, lo que evita su ejecución inmediata y solo pasa la referencia. Los tear-offs son útiles para callbacks, listas de funciones y operaciones que requieren funciones de manera flexible.
Para hacer un tear-off, simplemente escribe el nombre de la función o método sin paréntesis. Dart creará una referencia de esa función para que puedas usarla como argumento.
void mostrarMensaje(String mensaje) {
print(mensaje);
}
void ejecutarFuncion(void Function(String) funcion) {
funcion("Hola, Dart!");
}
void main() {
ejecutarFuncion(mostrarMensaje); // Pasamos la referencia de mostrarMensaje
}
En este ejemplo, mostrarMensaje
se pasa como referencia (sin paréntesis) a ejecutarFuncion
, y luego se ejecuta con el argumento proporcionado.
En este ejemplo, el tear-off permite pasar una función predefinida en lugar de definir un callback adicional.
void imprimir(String texto) {
print(texto);
}
void main() {
List<String> mensajes = ["Hola", "Bienvenido", "Gracias"];
mensajes.forEach(imprimir); // Usa tear-off en lugar de un callback anónimo
}
Aquí, imprimir
se pasa directamente como callback a forEach
, lo cual simplifica el código.
Los tear-offs también funcionan con métodos de instancia. Puedes hacer un tear-off del método de un objeto y utilizarlo en listas de funciones o mapas.
class Saludador {
void saludar(String nombre) {
print("Hola, $nombre!");
}
}
void main() {
Saludador saludador = Saludador();
List<String> nombres = ["Ana", "Luis", "Carlos"];
nombres.forEach(saludador.saludar); // Tear-off del método de instancia `saludar`
}
En este caso, saludador.saludar
se usa como referencia para cada elemento de la lista nombres
, y cada nombre se pasa automáticamente al método saludar
.
Puedes utilizar tear-off con constructores para crear instancias de objetos en listas o estructuras dinámicas.
class Persona {
String nombre;
Persona(this.nombre);
@override
String toString() => "Persona: $nombre";
}
void main() {
List<String> nombres = ["Juan", "Pedro", "Maria"];
var listaPersonas = nombres.map(Persona.new).toList(); // Tear-off del constructor
print(listaPersonas); // Imprime: [Persona: Juan, Persona: Pedro, Persona: Maria]
}
Aquí, Persona.new
es un tear-off del constructor Persona
, y se utiliza para crear instancias para cada nombre en la lista nombres
.
También puedes hacer un tear-off de funciones estáticas dentro de una clase.
class Calculadora {
static int sumar(int a, int b) => a + b;
}
void main() {
var operaciones = [Calculadora.sumar]; // Tear-off de la función estática
int resultado = operaciones[0](4, 5);
print("Resultado: $resultado"); // Imprime: Resultado: 9
}
En este ejemplo, Calculadora.sumar
es una referencia directa a la función estática sumar
, que luego se ejecuta con argumentos.
Para más detalles, consulta la documentación oficial de Dart sobre tear-off.
Jorge García
Fullstack developer