diegoRodicio

View Categories

🔎 Para saber máis

🧠 Callback, función anónima e closure

Son conceptos relacionados, pero describen cousas distintas:

  • Callback: o papel da función; entregámola para que outro código a chame.
  • Función anónima: unha función sen nome, como () => onSumar(cantidade).
  • Closure: unha función que conserva acceso ás variables do lugar onde se creou.

Este fragmento úsase dentro dun build e crea unha lista de botóns:

final alumnos = ['Xurxo', 'Iria', 'Roi'];
final botons = alumnos.map((nome) {
  return ElevatedButton(
    // Cada función conserva acceso ao nome desta chamada a map.
    onPressed: () => debugPrint('Seleccionado: $nome'),
    child: Text(nome),
  );
}).toList();
// Podemos usar botons como children dunha Column.

A función de onPressed é anónima, úsase como callback e é unha closure que conserva acceso a nome. Non garda unha copia de toda a pantalla nin converte automaticamente os datos en estado.

📚 Consulta:

🔁 Cambios na configuración: didUpdateWidget

O pai pode construír un widget novo e Flutter conservar o seu State. Nese caso, widget pasa a apuntar á nova configuración e chámase a didUpdateWidget antes de build.

Se só les widget.nome, xa accedes ao nome actualizado. Se gardaches unha copia en initState, esa copia non se actualiza soa. didUpdateWidget permite reaccionar ao cambio cando o deseño o precisa; nun editor, pensa antes se queres substituír o que o usuario está escribindo.

📚 Consulta:

⏳ Esperas e mounted

Unha operación con await pode rematar despois de pechar a pantalla. mounted indica se ese State segue na árbore; non podemos chamar a setState despois de dispose.

Fragmento dun método dun State: supoñemos que cargarNome devolve un Future<String> e que _nome é un atributo do estado.

Future<void> actualizarNome() async {
  final nome = await cargarNome(); // A espera faise fóra de setState.
  if (!mounted) return; // A pantalla puido pecharse durante a espera.
  setState(() {
    _nome = nome; // A función de setState segue sendo síncrona.
  });
}

Se iniciamos unha tarefa que se pode cancelar, como un temporizador ou unha subscrición, debemos cancelala en dispose cando deixe de ser necesaria. Comprobar mounted non cancela esa tarefa.

📚 Consulta:

🔑 Claves: Key

As claves axudan a Flutter a identificar widgets entre reconstrucións. Por exemplo, unha ValueKey co identificador dun alumno permite conservar a asociación co seu estado cando reordenamos unha lista de widgets con estado. Non necesitamos engadir claves a todos os widgets.

📚 Consulta:

🔔 ValueChanged<T>

É unha forma abreviada de escribir un callback que recibe un valor e non devolve nada. Por exemplo, ValueChanged<String> equivale a void Function(String).

📚 Consulta: