🧩 Enviar unha función a outra pantalla
Nos apartados anteriores aprendemos a enviar datos dunha pantalla a outra mediante os construtores ou o parámetro arguments.
Pero imaxinemos que abrimos unha segunda pantalla para escoller un alumno. Como podemos comunicar á pantalla principal o nome que seleccionamos?
Unha posibilidade é utilizar un callback, como xa vimos no Tema 3.3.
A idea é sinxela: a pantalla principal pásalle unha función á segunda pantalla. Cando o usuario escolle un alumno, a segunda pantalla executa esa función para comunicar o nome seleccionado.
No seguinte exemplo, a pantalla principal mostra o nome dun alumno e permite cambialo escollendo entre Xurxo, Iria e Roi.

📤 Preparar e pasar o callback
A pantalla principal garda o nome do alumno na variable _nome, dentro do seu State.
Para cambiar ese nome, definimos o método _actualizarNome(), que recibe un texto e actualiza a variable mediante setState():
void _actualizarNome(String nome) {
setState(() {
_nome = nome; // Gardamos o nome e actualizamos a interface.
});
}
Cando abrimos a segunda pantalla, enviámoslle tanto o nome actual como a función que permite cambialo:
PantallaSeleccion(
nomeActual: _nome, // Nome que queremos mostrar.
aoSeleccionar: _actualizarNome, // Función para comunicar a selección.
)
Neste código:
nomeActual: _nomeenvía o nome do alumno que está seleccionado.aoSeleccionar: _actualizarNomeenvía a función que permite actualizar ese nome.
💡 Fíxate: escribimos
_actualizarNomesen parénteses porque queremos pasar a función, non executala. Se escribísemos_actualizarNome('Iria'), estariamos executando o cambio nese momento, antes de que o usuario escollese un alumno.
📥 Recibir e executar a función
A segunda pantalla necesita un atributo para gardar a función recibida. Para iso declaramos:
final void Function(String) aoSeleccionar;
Nesta declaración:
void Function(String)indica que o atributo almacenará unha función que recibe un texto (String) e non devolve ningún valor (void).aoSeleccionaré o nome que lle damos a ese atributo.
A función recíbese a través do construtor, igual que calquera outro dato.
Cando o usuario selecciona un alumno, executamos a función recibida e pechamos a pantalla:
aoSeleccionar('Iria'); // Comunicamos o nome seleccionado.
Navigator.pop(context); // Volvemos á pantalla anterior.
Son dúas accións diferentes:
aoSeleccionar('Iria')executa a función recibida para actualizar o nome na pantalla principal.Navigator.pop(context)pecha a segunda pantalla e volve á anterior.
É importante comprender que a segunda pantalla non modifica directamente a variable _nome. Simplemente executa a función que recibiu, e esa función encárgase de actualizar o dato na pantalla principal.
💡 Aínda que na segunda pantalla chamamos á función
aoSeleccionar(), realmente estamos executando_actualizarNome(), porque esa foi a función que lle pasamos desde a pantalla principal.
🧪 Exemplo completo
🔗 DartPad:

🔍 Seguir o cambio paso a paso
- A pantalla principal comeza mostrando o alumno Xurxo, porque
_nome = 'Xurxo'. - Ao premer «Escoller», abrimos
PantallaSeleccione pasámoslle a función_actualizarNomemediante o atributoaoSeleccionar. - Na segunda pantalla prememos «Iria», polo que se executa
aoSeleccionar('Iria'). - Como
aoSeleccionarcontén a función_actualizarNome, realmente estamos executando_actualizarNome('Iria')na pantalla principal. - Esta función utiliza
setState()para cambiar o valor de_nomea'Iria'e solicitar a actualización da interface. - Finalmente,
Navigator.pop(context)pecha a segunda pantalla e volvemos á principal, onde aparece «Alumno: Iria».
💡 Lembra:
aoSeleccionar()e_actualizarNome()non son dúas funcións diferentes neste exemplo.aoSeleccionaré o atributo que garda a referencia á función_actualizarNome, recibida desde a pantalla principal.
Se volvemos coa frecha sen seleccionar ningún alumno, non se executa o callback e o nome anterior consérvase.
💡 A segunda pantalla pode ser un
StatelessWidgetporque non necesita gardar un estado propio que cambie. Simplemente mostra os datos recibidos e comunica a opción seleccionada. O estado que cambia pertence á pantalla principal, que é unStatefulWidget.
No seguinte apartado veremos outra forma de comunicar o resultado: devolvelo ao pechar a ruta e recollelo mediante await. Son dúas alternativas para comunicar información entre pantallas, polo que non necesitamos utilizar ambas para transmitir o mesmo cambio.
📚 Consulta: