Sự mượt mà và phản hồi nhanh của ứng dụng Flutter, kể cả khi thực thi các tác vụ phức tạp như truy cập mạng hoặc xử lý nặng, là nhờ vào cơ chế xử lý bất đồng bộ (asynchronous programming) của Dart. Bài viết này sẽ phân tích chi tiết cách Dart hoạt động bên trong, từ đó giúp bạn viết các ứng dụng mượt mà, không giật lag, và tối ưu UI.
🧱 Isolate - Nền tảng đơn luồng độc lập của Dart
Dart hoạt động dựa trên kiến trúc mỗi Isolate là một đơn vị độc lập, có vùng bộ nhớ riêng và không chia sẻ trực tiếp trạng thái với Isolate khác.
Thành phần | Mô tả |
---|---|
Isolate | Một "công nhân" đơn luồng, có heap riêng. |
Memory | Không chia sẻ với Isolate khác ➜ tránh race condition, không cần dùng lock. |
Communication | Dùng SendPort và ReceivePort để gửi/nhận thông điệp. |
Event Loop | Mỗi Isolate có Event Loop riêng để xử lý tác vụ bất đồng bộ. |
🧠 Ghi nhớ: Trong Flutter, UI chạy trong Isolate chính, và mọi tác vụ dài cần được đưa qua Isolate phụ hoặc thực thi bất đồng bộ để tránh UI bị "đứng hình".
🔄 Event Loop - Trái tim điều phối bất đồng bộ
Event Loop là cơ chế lặp liên tục để kiểm tra và xử lý các hàng đợi tác vụ:
while (true) { xử lý Microtask Queue; nếu rỗng, xử lý 1 Event từ Event Queue; lặp lại;
}
✳️ Thứ tự ưu tiên:
- Microtask Queue (cao nhất)
- Event Queue
Event Loop đảm bảo UI luôn được cập nhật nếu các tác vụ ngắn và không chiếm giữ luồng quá lâu.
🧵 Hai loại hàng đợi chính: Microtask vs Event Queue
Loại Queue | Ưu tiên | Nguồn tác vụ | Đặc điểm |
---|---|---|---|
Microtask Queue | Cao hơn | Future.then() , scheduleMicrotask() |
Chạy ngay sau khối đồng bộ hiện tại, trước Event Queue |
Event Queue | Thấp hơn | Timer, I/O, người dùng tương tác | Được xử lý sau khi Microtask Queue rỗng |
⚠️ Lưu ý: Lạm dụng Microtask Queue với tác vụ dài có thể làm chậm UI do Event Queue bị "nghẽn".
📦 Future<T>: Cam kết về giá trị (hoặc lỗi) trong tương lai
Future<T>
đại diện cho một kết quả sẽ có trong tương lai, không có ngay lập tức.
🔁 Các trạng thái của Future:
Trạng thái | Diễn giải |
---|---|
Uncompleted |
Future mới khởi tạo, chưa có kết quả |
Completed with value |
Kết thúc thành công với dữ liệu |
Completed with error |
Kết thúc thất bại với lỗi |
📌 Các phương thức xử lý:
Phương thức | Mô tả |
---|---|
.then((value) => ...) |
Xử lý khi thành công |
.catchError(...) |
Xử lý lỗi nếu có |
.whenComplete(...) |
Luôn gọi dù thành công hay lỗi |
Future.value(x) |
Future hoàn thành ngay lập tức |
Future.delayed(...) |
Future hoàn thành sau thời gian trễ |
✨ async/await - Viết mã bất đồng bộ như đồng bộ
✅ async
:
- Đánh dấu một hàm là bất đồng bộ.
- Trả về
Future<T>
. - Nếu hàm trả về giá trị thường, Dart tự động gói thành
Future.value(...)
.
⏸️ await
:
- Dùng trong hàm
async
để tạm dừng xử lý cho đến khiFuture
hoàn thành. - Không chặn Event Loop ➜ ứng dụng vẫn phản hồi mượt mà.
🔍 Ví dụ: Minh hoạ luồng thực thi bất đồng bộ
Future<String> fetchData() async { print("Bắt đầu fetchData..."); // (1) String result = await Future.delayed(Duration(seconds: 2), () { print("API call hoàn thành."); // (3) return "Dữ liệu từ server"; }); print("fetchData hoàn thành với: $result"); // (4) return result;
} void main() async { print("Chương trình bắt đầu."); // (2) String data = await fetchData(); // (5) print("Dữ liệu nhận được: $data"); // (6) print("Chương trình kết thúc."); // (7)
}
🔄 Thứ tự in ra sẽ là:
- Bắt đầu fetchData...
- Chương trình bắt đầu.
- API call hoàn thành. (sau 2s)
- fetchData hoàn thành với: ...
- Dữ liệu nhận được: ...
- Chương trình kết thúc.
🎯 Tổng Kết
Thành phần | Tóm tắt |
---|---|
Isolate | Mỗi đơn vị xử lý độc lập, không chia sẻ bộ nhớ |
Event Loop | Điều phối xử lý bất đồng bộ theo thứ tự ưu tiên |
Microtask Queue | Ưu tiên cao nhất, thường từ .then() |
Event Queue | Chứa các sự kiện I/O, Timer, UI |
Future<T> | Đại diện kết quả trong tương lai |
async/await | Viết code bất đồng bộ dễ hiểu, mượt mà |
⚡️ Nắm vững cơ chế bất đồng bộ trong Dart không chỉ giúp bạn viết code sạch hơn mà còn tránh được những lỗi khó chịu như UI giật, ứng dụng đứng hình, hay race condition.
📌 Bạn có thể thử áp dụng ngay kiến thức này vào các chức năng như gọi API, debounce tìm kiếm, load dữ liệu lớn mà không block UI trong Flutter.