# Immutable model và sealed class

> MatchRecord với == viết tay, ScoreBoard và RoundState trả instance mới thay vì sửa tại chỗ, sealed class cho kết quả một ván và cho một lần đọc dữ liệu, và bài test đầu tiên.

- URL: https://dantech.academy/courses/flutter-mobile-101/03-mvvm/lesson-02-model-and-ui-state
- Khóa học: [Flutter Mobile 101](https://dantech.academy/courses/flutter-mobile-101.md)
- Module: MVVM
- Thời lượng: 20 phút
- Độ khó: beginner
- Truy cập: Dành cho học viên

## Mục tiêu

- Đọc được model bất biến: const constructor, == và hashCode viết tay, cập nhật bằng cách trả instance mới
- Đọc được RoundState: một object bất biến gói cả ván, cập nhật bằng copy
- Mô tả kết quả của một ván (RoundOutcome) và bốn kết quả của một lần đọc dữ liệu (StatsReadResult) bằng sealed class, xử lý đủ bằng switch exhaustive
- Viết và chạy một bài test Dart thuần không cần emulator

## Nội dung bài học

1. MatchRecord: Một Ván Đã Xong
2. ScoreBoard: Cập Nhật Là Tạo Bản Mới
3. RoundState: Cả Một Ván Trong Một Object
4. Sealed Class: Thắng, Hòa, Hay Đang Chơi
5. Sealed Class: Bốn Kết Quả Của Một Lần Đọc
6. Switch Exhaustive: Compiler Làm Việc Cho Bạn
7. Bài Test Đầu Tiên Của Khóa

## Học cùng AI agent

Toàn bộ bài học dành cho học viên của khóa. Học viên mở bài trên web và bấm nút **Markdown** để copy toàn bài, rồi dán vào Claude, ChatGPT, Cursor hoặc agent bạn đang dùng. Nhanh hơn: tạo token ở `/profile/ai-agents` và agent đọc bài trực tiếp qua MCP.

- [Đăng ký khóa học](https://dantech.academy/flutter-mobile-101/checkout)

---

- Bài trước: [MVVM: Model, View, ViewModel in Flutter](https://dantech.academy/courses/flutter-mobile-101/03-mvvm/lesson-01-why-mvvm-and-three-layers.md)
- Bài tiếp theo: [ChangeNotifier và ListenableBuilder](https://dantech.academy/courses/flutter-mobile-101/03-mvvm/lesson-03-viewmodel-with-changenotifier.md)
