Mục tiêu:
- Hiểu sự khác biệt giữa StatelessWidget và StatefulWidget
- Cách sử dụng
setState
để cập nhật giao diện - Thực hành với các thành phần có trạng thái: nút bấm, checkbox, counter

1. StatelessWidget vs StatefulWidget
StatelessWidget
: không thay đổi, chỉ hiển thị dữ liệu tĩnh.StatefulWidget
: có thể thay đổi theo dữ liệu hoặc tương tác người dùng.
Ví dụ:
class MyText extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Text('Nội dung cố định');
}
}
class MyCounter extends StatefulWidget {
@override
_MyCounterState createState() => _MyCounterState();
}
class _MyCounterState extends State<MyCounter> {
int count = 0;
@override
Widget build(BuildContext context) {
return Column(
children: [
Text('Đã bấm $count lần'),
ElevatedButton(
onPressed: () {
setState(() {
count++;
});
},
child: Text('Bấm'),
),
],
);
}
}
2. setState – cập nhật giao diện
setState
thông báo cho Flutter biết rằng một phần của State
đã thay đổi. Sau khi gọi, widget sẽ được vẽ lại.

setState(() {
count += 1;
});
3. Ví dụ 1: Counter app
int _counter = 0;
ElevatedButton(
onPressed: () {
setState(() {
_counter++;
});
},
child: Text('Đếm: $_counter'),
)
4. Ví dụ 2: Bật tắt Switch
bool isDark = false;
Switch(
value: isDark,
onChanged: (value) {
setState(() {
isDark = value;
});
},
)
5. Ví dụ 3: Tùy chỉnh văn bản
String message = "Xin chào";
TextField(
onChanged: (value) {
setState(() {
message = value;
});
},
)
Text(message)
6. Ghi chú quan trọng
setState
phải được gọi trongState
class, không được gọi trongbuild
hoặc bên ngoàiStatefulWidget
.- Cần dùng đúng khi muốn dữ liệu thay đổi ảnh hưởng trực tiếp đến giao diện.

7. Bài tập thực hành
- Tạo một nút Like, nhấn vào thì đổi trạng thái đã thích/chưa thích.
- Tạo checkbox điều khiển hiển thị một đoạn văn bản.
- Làm app đếm số lượng sản phẩm thêm vào giỏ.
Bài tiếp theo: Navigation trong Flutter – chuyển trang, truyền dữ liệu giữa các màn hình.
Sign up