Callbacks que enviam um valor
Parte da seção Gerenciamento de estado do Journey de Flutter da Coddy. Lição 3 de 27.
Um callback pode levar um valor de volta. O seletor de tamanho abaixo tem três botões, e a página precisa saber em qual deles foi tocado.
Adicione um parâmetro ao callback. O tipo void Function(String) é uma função que recebe um String e não retorna 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ão envolve a chamada em uma função pequena, () => onPick('S'), para que ela seja executada ao tocar no botão, e não durante a construção. O componente pai recebe o valor como parâmetro e o mantém:
SizePicker(
onPick: (picked) {
setState(() {
size = picked;
});
},
)O Flutter tem um nome mais curto para o mesmo tipo: ValueChanged<String>. Muitos widgets integrados o usam, como o onChanged de um TextField.
Desafio
MédioFaça os botões de tamanho funcionarem:
- Dê a
SizePickerum campofinal void Function(String) onPick, definido pelo construtor. - Faça cada botão chamar
onPickcom sua própria letra. - Na página, mostre o tamanho selecionado:
Size: S,Size: MouSize: L.
Experimente você mesmo
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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Gerenciamento de estado
1Elevando o estado
Passar o estado para um componente filhoPassar um callback para um componente filhoCallbacks que enviam um valorElevar o estadoPratique por conta própria: Compilador de Flutter online