Cả hai là widget "tự rebuild theo dữ liệu bất đồng bộ", khác nhau ở nguồn dữ liệu phát ra bao nhiêu giá trị:
FutureBuilderlắng nghe mộtFuture— nguồn phát đúng một kết quả rồi kết thúc. Hợp với thao tác một-lần: gọi API lấy chi tiết sản phẩm, đọc file, truy vấn một câu.StreamBuilderlắng nghe mộtStream— nguồn phát nhiều giá trị theo thời gian. Hợp với dữ liệu liên tục: cập nhật Firestore realtime, vị trí GPS, trạng thái kết nối, tick đồng hồ.
Cả hai đều đưa cho builder một AsyncSnapshot để bạn xử lý từng trạng thái:
dart
StreamBuilder<int>(
stream: counterStream,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const CircularProgressIndicator();
}
if (snapshot.hasError) return Text('Lỗi: ${snapshot.error}');
return Text('Giá trị: ${snapshot.data}');
},
)Lưu ý: đừng tạo Future/Stream ngay trong hàm build() — mỗi lần rebuild sẽ tạo nguồn mới và chạy lại từ đầu.
Hãy khởi tạo nguồn ở initState() (hoặc lấy từ tầng state management) rồi truyền vào.