Callback che inviano un valore
Fa parte della sezione Gestione dello stato del percorso Flutter di Coddy. Lezione 3 di 27.
Una callback può riportare un valore al livello superiore. Il selettore di taglie qui sotto ha tre pulsanti e la pagina deve sapere quale è stato premuto.
Assegna un parametro alla callback. Il tipo void Function(String) è una funzione che accetta una String e non restituisce nulla:
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'),
);
}
}Ogni pulsante racchiude la chiamata in una piccola funzione, () => onPick('S'), così viene eseguita quando si tocca il pulsante e non durante la build. Il componente genitore riceve il valore come parametro e lo conserva:
SizePicker(
onPick: (picked) {
setState(() {
size = picked;
});
},
)Flutter ha un nome breve per lo stesso tipo: ValueChanged<String>. Molti widget integrati lo utilizzano, come onChanged di un TextField.
Sfida
MedioFai funzionare i pulsanti delle taglie:
- Aggiungi a
SizePickeril campofinal void Function(String) onPick, impostato dal suo costruttore. - Fai in modo che ogni pulsante chiami
onPickcon la propria lettera. - Nella pagina, mostra la taglia selezionata:
Size: S,Size: MoSize: L.
Provalo tu
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')),
],
);
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Gestione dello stato
1Solleva lo stato
Passare lo stato a un componente figlioPassare una callback a un componente figlioCallback che inviano un valoreSolleva lo statoEsercitati da solo: Compilatore Flutter online