Callback gửi giá trị
Thuộc phần Quản lý trạng thái trong hành trình Flutter của Coddy. Bài học 3 trên 27.
Một callback có thể mang giá trị ngược lên. Bộ chọn kích cỡ bên dưới có ba nút, và trang cần biết bạn đã nhấn nút nào.
Thêm tham số cho callback. Kiểu void Function(String) là một hàm nhận một String và không trả về gì:
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'),
);
}
}Mỗi nút bọc lời gọi trong một hàm nhỏ, () => onPick('S'), để hàm chạy khi bạn nhấn nút chứ không phải trong lúc dựng giao diện. Thành phần cha nhận giá trị dưới dạng tham số và lưu lại:
SizePicker(
onPick: (picked) {
setState(() {
size = picked;
});
},
)Flutter có tên ngắn gọn cho cùng kiểu này: ValueChanged<String>. Nhiều widget có sẵn sử dụng kiểu này, chẳng hạn như onChanged của TextField.
Thử thách
Trung bìnhHãy làm cho các nút chọn kích cỡ hoạt động:
- Thêm cho
SizePickermột trườngfinal void Function(String) onPick, được thiết lập trong hàm khởi tạo. - Cho mỗi nút gọi
onPickvới chữ cái tương ứng. - Hiển thị kích cỡ đã chọn trên trang:
Size: S,Size: MhoặcSize: L.
Tự làm thử
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')),
],
);
}
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Quản lý trạng thái
1Đưa state lên cấp trên
Truyền state cho component conTruyền callback cho component conCallback gửi giá trịĐưa state lên cấp trênTự luyện tập: Trình biên dịch Flutter online