Trong Flutter, async
và async*
đều là từ khóa được sử dụng trong các hàm không đồng bộ (asynchronous functions), nhưng chúng có mục đích và cách sử dụng khác nhau.
async
Từ khóa async
được sử dụng khi bạn muốn một hàm thực hiện các công việc không đồng bộ và trả về một giá trị đơn lẻ thông qua Future
. Những công việc không đồng bộ này có thể bao gồm các thao tác như gọi API, đọc dữ liệu từ file hoặc thực hiện các phép tính phức tạp mà bạn không muốn làm gián đoạn luồng chính (main thread) của ứng dụng.
Cách sử dụng async
đi kèm với từ khóa await
, giúp bạn chờ đợi một Future hoàn thành trước khi thực hiện các thao tác tiếp theo. Khi một hàm được khai báo là async
, nó sẽ tự động trả về một Future
.
Ví dụ:
Future<void> fetchData() async {
print('Fetching data...');
await Future.delayed(Duration(seconds: 2)); // Giả lập việc chờ đợi một tác vụ không đồng bộ
print('Data fetched');
}
Trong ví dụ này:
- Hàm
fetchData
sử dụng async
, và bên trong nó, await
giúp chờ đợi 2 giây trước khi tiếp tục thực hiện lệnh tiếp theo.
Future<void>
cho biết hàm này không trả về dữ liệu gì nhưng vẫn là một Future
.
async*
Từ khóa async*
được sử dụng khi bạn muốn một hàm trả về một chuỗi các giá trị không đồng bộ thay vì chỉ một giá trị duy nhất. Khi đó, hàm sẽ trả về một Stream
thay vì một Future
. Điều này rất hữu ích khi bạn cần phát (emit) nhiều giá trị theo thời gian và không thể biết trước số lượng hoặc thời điểm phát các giá trị đó.
Trong async*
, từ khóa yield
hoặc yield*
được sử dụng để phát từng giá trị khi chúng sẵn sàng, thay vì đợi tất cả các giá trị hoàn thành trước khi trả về một kết quả duy nhất như async
.
Ví dụ:
Stream<int> countStream() async* {
for (int i = 1; i <= 5; i++) {
await Future.delayed(Duration(seconds: 1)); // Giả lập tác vụ không đồng bộ
yield i; // Phát từng giá trị theo thời gian
}
}
Trong ví dụ này:
- Hàm
countStream
sử dụng async*
, và mỗi giây, một giá trị từ 1 đến 5 sẽ được phát ra thông qua yield
.
- Hàm trả về một
Stream<int>
, và khi được lắng nghe, các giá trị sẽ được phát dần dần.
Tóm lại
async
: Dùng cho các hàm trả về một giá trị duy nhất (thông qua Future
), thường kết hợp với await
để chờ các tác vụ không đồng bộ hoàn thành.
async*
: Dùng cho các hàm trả về một chuỗi giá trị (thông qua Stream
), thường kết hợp với yield
để phát các giá trị dần dần theo thời gian.
Khi nào nên sử dụng cái nào tùy thuộc vào tình huống cụ thể. Nếu bạn cần xử lý các tác vụ không đồng bộ mà chỉ trả về một kết quả, sử dụng async
. Còn nếu bạn muốn xử lý và phát ra nhiều giá trị theo thời gian, sử dụng async*
.