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!, End4. 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/awaitviết code đồng bộ hơntry/catchxử lý lỗiFuture.waitchạy nhiều futures song songtimeoutgiới hạn thời gian chờ
Last updated on