Callbacks que envían un valor
Parte de la sección Gestión del estado del Journey de Flutter de Coddy. Lección 3 de 27.
Una devolución de llamada puede llevar un valor de vuelta al elemento superior. El selector de tallas de abajo tiene tres botones, y la página necesita saber cuál se tocó.
Dale un parámetro a la devolución de llamada. El tipo void Function(String) es una función que recibe un String y no devuelve nada:
class SizePicker extends StatelessWidget {
const SizePicker({super.key, required this.onPick});
final void Function(String) onPick;
@override
Widget build(BuildContext context) {
return OutlinedButton(
onPressed: () => onPick('S'),
child: Text('S'),
);
}
}Cada botón envuelve la llamada en una función pequeña, () => onPick('S'), para que se ejecute al tocarlo y no durante la construcción. El elemento padre recibe el valor como parámetro y lo guarda:
SizePicker(
onPick: (picked) {
setState(() {
size = picked;
});
},
)Flutter tiene un nombre corto para el mismo tipo: ValueChanged<String>. Muchos widgets integrados lo usan, como onChanged de un TextField.
Desafío
IntermedioHaz que funcionen los botones de talla:
- Agrega a
SizePickerun campofinal void Function(String) onPick, establecido por su constructor. - Haz que cada botón llame a
onPickcon su propia letra. - En la página, muestra la talla seleccionada:
Size: S,Size: MoSize: L.
Pruébalo tú mismo
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
String size = 'M';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('T-shirt')),
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text('Size: $size', style: const TextStyle(fontSize: 32)),
const SizedBox(height: 16),
const SizePicker(),
],
),
),
);
}
}
class SizePicker extends StatelessWidget {
const SizePicker({super.key});
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
OutlinedButton(onPressed: () {}, child: const Text('S')),
const SizedBox(width: 8),
OutlinedButton(onPressed: () {}, child: const Text('M')),
const SizedBox(width: 8),
OutlinedButton(onPressed: () {}, child: const Text('L')),
],
);
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Gestión del estado
1Elevar el estado
Pasar el estado a un componente hijoPasar una función callback a un componente hijoCallbacks que envían un valorElevar el estadoPractica por tu cuenta: Compilador de Flutter online