diegoRodicio

Está documentación está a túa disposición sin ningún custo económico. Sen embargo, para a súa elaboración dedico moito tempo e recursos, polo que agradecería unha colaboración co que consideres oportuno. Gracias.

View Categories

🧩 Callbacks en Flutter

En Flutter, moitos widgets personalizados (como botóns, iconas ou contedores táctiles) precisan executar unha acción cando o usuario realiza unha interacción, por exemplo, ao premer unha tecla ou tocar un botón.

Para conseguilo, o widget non executa directamente a acción, senón que recibe unha función (callback) definida polo widget pai.
Deste modo, o widget pai decide que facer, e o fillo simplemente chama á función cando corresponde.

⚙️ Como se define un callback #

Para permitir esa comunicación entre widgets, o fillo define un atributo de tipo función, que gardará a referencia á función que debe chamarse.

Hai dúas formas habituais de definilo:

final void Function(int) nome1; // función con parámetro
final VoidCallback nome2;       // función sen parámetros

💡 Tipos de callbacks e usos máis comúns #

TipoFirma da funciónDescriciónExemplo típico
VoidCallbackvoid Function()Callback sen parámetros e sen retorno. Úsase cando só hai que executar unha acción.onPressed: _borrar
void Function(int)void Function(int valor)Callback cun parámetro enteiro. Úsase cando o widget necesita comunicar un número (ex.: unha tecla).onTap: (n) => _pulsarNumero(n)
void Function(String)void Function(String texto)Callback cun parámetro tipo texto. Úsase en campos de entrada como TextField.onChanged: (valor) => print(valor)

Notas:

  • Se non precisas datos, usa VoidCallback.
  • Se precisas pasar un valor, usa void Function(Tipo) (por exemplo, void Function(int)).

Equivalentes (sen parámetros):

final VoidCallback accion1;
final void Function() accion2; // fan o mesmo

⚡ Callback sen parámetros: VoidCallback #

O tipo VoidCallback é a forma máis sinxela de definir un callback en Flutter.
Representa unha función sen argumentos e sen retorno, que se executa cando ocorre unha acción.

É moi común en botóns e xestos, como ElevatedButton, IconButton ou GestureDetector.

🧠 Exemplo práctico #

class BotonSimple extends StatelessWidget {
  final String texto;
  final VoidCallback onTap; // función sen parámetros. É equivalente a: final Function() onTap;

  const BotonSimple({
    super.key,
    required this.texto,
    required this.onTap,
  });

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: onTap, // chamamos directamente á función
      child: Text(texto),
    );
  }
}

E dende o widget pai:

BotonSimple(
  texto: 'Borrar',
  onTap: () {
    print('Botón premido!');
  },
),

👉 O fillo (BotonSimple) non sabe o que debe facer;
só chama a onTap() cando o usuario o preme, e o pai decide a acción concreta.

🧩 Callback con parámetros #

Hai casos nos que non chega con saber que se premeu, senón que valor se premeu.
Por exemplo, nun teclado de calculadora, queremos saber que número tocou o usuario.

Para iso non abonda con VoidCallback (que non admite parámetros).
Debemos usar unha función que reciba un argumento, como:

final void Function(int) onNumero;

⚙️ Que significa cada parte #

ElementoDescrición
finalIndica que a propiedade non pode cambiar tras inicializarse (os widgets son inmutables).
void Function(int)Tipo de función que non devolve nada (void) pero recibe un parámetro enteiro (int).
onNumeroNome do callback (o identificador da función que se executará).

🧠 Exemplo: pasar o número premido #

1️⃣ Declaramos o callback no widget #

class TeclaNumero extends StatelessWidget {
  final int numero;
  final void Function(int) onTap; // ← función con parámetro

  const TeclaNumero({
    super.key,
    required this.numero,
    required this.onTap,
  });

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () => onTap(numero), // ← pásase o número ao callback
      child: Text('$numero'),
    );
  }
}

📌 Neste exemplo, onTap é unha función que recibirá o valor do número cando o usuario prema a tecla.

2️⃣ Usámolo dende o widget pai #

TeclaNumero(
  numero: 7,
  onTap: (valor) {
    print('Premeuse o número $valor');
  },
),

O widget pai define que facer co número recibido, mentres o fillo só sabe que debe chamar a onTap(numero) cando se preme.

🧭 Resumo visual #

Pai → define a lóxica
     ↓
Fillo → chama ao callback pasando o valor

onTap(numero)

📚 Fontes oficiais #