Skip to Content

Futures trong Dart

1. Giới thiệu

Future đại diện cho một giá trị sẽ có trong tương lai, dùng cho lập trình bất đồng bộ.

2. Tạo Future cơ bản

Future<String> fetchData() { return Future.delayed( Duration(seconds: 2), () => 'Data loaded!', ); } void main() { print('Start'); fetchData().then((data) { print(data); }); print('End'); } // Output: Start, End, Data loaded!

3. async/await

Future<String> fetchData() async { await Future.delayed(Duration(seconds: 2)); return 'Data loaded!'; } Future<void> main() async { print('Start'); String data = await fetchData(); print(data); print('End'); } // Output: Start, Data loaded!, End

4. Xử lý lỗi

Future<String> fetchData() async { await Future.delayed(Duration(seconds: 1)); throw Exception('Network error'); } // Với then/catchError void example1() { fetchData() .then((data) => print(data)) .catchError((error) => print('Error: $error')); } // Với try/catch Future<void> example2() async { try { var data = await fetchData(); print(data); } catch (e) { print('Error: $e'); } }

5. Future.value và Future.error

Future<int> getValue() { return Future.value(42); // Resolved immediately } Future<int> getError() { return Future.error('Something went wrong'); }

6. Future.wait - Chạy song song

Future<void> main() async { var results = await Future.wait([ fetchUser(), fetchPosts(), fetchComments(), ]); print('User: ${results[0]}'); print('Posts: ${results[1]}'); print('Comments: ${results[2]}'); }

7. Future.any - Lấy kết quả đầu tiên

Future<String> server1() async { await Future.delayed(Duration(seconds: 3)); return 'Server 1'; } Future<String> server2() async { await Future.delayed(Duration(seconds: 1)); return 'Server 2'; } Future<void> main() async { var fastest = await Future.any([server1(), server2()]); print(fastest); // Server 2 }

8. whenComplete - Finally

Future<void> main() async { await fetchData() .then((data) => print('Success: $data')) .catchError((e) => print('Error: $e')) .whenComplete(() => print('Done!')); }

9. Timeout

Future<void> main() async { try { var result = await fetchData() .timeout(Duration(seconds: 5)); print(result); } on TimeoutException { print('Request timed out'); } }

10. FutureBuilder trong Flutter

FutureBuilder<String>( future: fetchData(), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return CircularProgressIndicator(); } if (snapshot.hasError) { return Text('Error: ${snapshot.error}'); } return Text('Data: ${snapshot.data}'); }, )

📝 Tóm tắt

  • Future đại diện giá trị bất đồng bộ
  • async/await viết code đồng bộ hơn
  • try/catch xử lý lỗi
  • Future.wait chạy nhiều futures song song
  • timeout giới hạn thời gian chờ
Last updated on