+6

Giải Mã Cơ Chế Bất Đồng Bộ Trong Dart: Nền Tảng Cho Ứng Dụng Flutter Hiệu Năng Cao

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.


image.png

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 SendPortReceivePort để 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:

  1. Microtask Queue (cao nhất)
  2. 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 khi Future 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à:

  1. Bắt đầu fetchData...
  2. Chương trình bắt đầu.
  3. API call hoàn thành. (sau 2s)
  4. fetchData hoàn thành với: ...
  5. Dữ liệu nhận được: ...
  6. 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.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí