StatelessWidget và StatefulWidget — khi nào dùng loại nào?


Một trong những quyết định quan trọng nhất khi phát triển Flutter là chọn giữa StatelessWidget và StatefulWidget. Bài viết này sẽ giúp bạn hiểu rõ sự khác biệt và biết khi nào nên dùng loại nào.
Tổng quan
StatelessWidget
StatelessWidget là widget không thay đổi sau khi được tạo. Nó chỉ phụ thuộc vào các tham số (parameters) được truyền vào.
StatefulWidget
StatefulWidget là widget có thể thay đổi trong suốt vòng đời của nó. Nó có thể lưu trữ và cập nhật state.
StatelessWidget
Đặc điểm:
- ✅ Immutable: Không thể thay đổi sau khi tạo
- ✅ Nhẹ: Hiệu suất tốt hơn
- ✅ Đơn giản: Dễ hiểu và maintain
- ✅ Pure function: build() luôn trả về cùng kết quả với cùng input
Cú pháp:
[object Object]Khi nào dùng StatelessWidget?
1. Widget chỉ hiển thị dữ liệu
[object Object]2. Widget nhận data từ parent
[object Object]3. Widget chỉ render UI, không có logic phức tạp
[object Object]StatefulWidget
Đặc điểm:
- ✅ Mutable: Có thể thay đổi state
- ✅ Interactive: Có thể xử lý user input
- ✅ Dynamic: UI có thể thay đổi theo state
- ⚠️ Phức tạp hơn: Cần quản lý state
Cú pháp:
[object Object]Khi nào dùng StatefulWidget?
1. Widget cần quản lý state nội bộ
[object Object]2. Widget cần xử lý user input
[object Object]3. Widget cần animation
[object Object]4. Widget cần fetch data và hiển thị
[object Object]So sánh chi tiết
| Tiêu chí | StatelessWidget | StatefulWidget |
|---|---|---|
| State | Không có | Có state |
| Rebuild | Khi parent rebuild | Khi setState() được gọi |
| Hiệu suất | Tốt hơn | Tốt (nhưng cần quản lý state) |
| Độ phức tạp | Đơn giản | Phức tạp hơn |
| Sử dụng khi | Chỉ hiển thị data | Cần tương tác, thay đổi |
Quy tắc chọn lựa
Dùng StatelessWidget khi:
✅ Widget chỉ nhận data từ parent và hiển thị
✅ Widget không cần thay đổi sau khi tạo
✅ Widget là pure function (cùng input → cùng output)
✅ Widget không cần quản lý controllers, timers, animations
Ví dụ:
- ProductCard
- UserAvatar
- CustomButton (chỉ nhận callback)
- Header/Footer components
Dùng StatefulWidget khi:
✅ Widget cần quản lý state nội bộ
✅ Widget cần xử lý user input (forms, text fields)
✅ Widget cần animation
✅ Widget cần fetch và quản lý data
✅ Widget cần timers, streams, subscriptions
Ví dụ:
- LoginForm
- Counter
- SearchBar với suggestions
- Image carousel
- Video player
Best Practices
1. Ưu tiên StatelessWidget
Luôn bắt đầu với StatelessWidget, chỉ chuyển sang StatefulWidget khi thực sự cần:
[object Object]2. Tách biệt Stateless và Stateful
Tách logic stateful ra widget riêng:
[object Object]3. Sử dụng const constructor khi có thể
[object Object]4. Tránh setState không cần thiết
[object Object]Ví dụ thực tế: Todo App
StatelessWidget - TodoItem
[object Object]StatefulWidget - TodoList
[object Object]Kết luận
Tóm tắt:
StatelessWidget:
- Dùng khi widget không cần thay đổi
- Đơn giản, hiệu suất tốt
- Ưu tiên sử dụng
StatefulWidget:
- Dùng khi cần quản lý state
- Phức tạp hơn nhưng linh hoạt
- Chỉ dùng khi thực sự cần
Quy tắc vàng:
"Luôn bắt đầu với StatelessWidget. Chỉ chuyển sang StatefulWidget khi bạn thực sự cần quản lý state."
Hiểu rõ sự khác biệt giữa StatelessWidget và StatefulWidget sẽ giúp bạn viết code Flutter hiệu quả và dễ maintain hơn!
Tác giả: Admin
Ngày đăng: 23/01/2025
Chuyên mục: Flutter
Bài viết liên quan
Ngành không liên quan cũng học được Flutter – Câu chuyện của một bạn học viên trái ngành
Đào Trung Hiếu, một chủ tiệm nail tại Phần Lan, đã chứng minh rằng không bao giờ là quá muộn để bắt đầu học lập trình. Với nền tảng hoàn toàn không liên quan đến công nghệ, anh đã quyết định học Flutter để phát triển ứng dụng quản lý cho tiệm nail của mình.
So sánh Flutter và React Native: Ưu nhược điểm và lựa chọn nào tối ưu cho người mới
Hướng dẫn chi tiết so sánh Flutter và React Native, phân tích ưu nhược điểm, và đưa ra lời khuyên cho người mới bắt đầu phát triển ứng dụng mobile.
ScrollController: Kéo vô hạn, cuộn mượt và load thêm dữ liệu
Hướng dẫn sử dụng ScrollController trong Flutter để tạo infinite scroll, smooth scrolling và load more data khi cuộn.
