Skip to content

Commit 0c38842

Browse files
committed
add
1 parent 68e3528 commit 0c38842

4 files changed

Lines changed: 633 additions & 0 deletions

File tree

_posts/2025-12-03-739-future.md

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
---
2+
layout: post
3+
title: Future
4+
pid: 739
5+
tags: [flutter]
6+
---
7+
8+
```dart
9+
void futureStateDemo() async {
10+
print('=== Future的状态和缓存 ===');
11+
12+
// 创建一个Future
13+
var future = Future.delayed(Duration(seconds: 2), () {
14+
print('Future计算完成');
15+
return 42; // 计算结果
16+
});
17+
18+
// 状态1: Uncompleted(未完成) - 0~2秒
19+
print('创建后立即检查:');
20+
print(' 是否完成? ${future is Future<int>}'); // true,但还未计算
21+
print(' 当前时间: ${DateTime.now()}');
22+
23+
// 等3秒,让Future完成
24+
await Future.delayed(Duration(seconds: 3));
25+
26+
// 状态2: Completed with value(已完成,有值) - 2秒后
27+
print('\n3秒后检查:');
28+
var value = await future; // ⭐ 这里是从缓存取值!
29+
print(' 取值: $value');
30+
print(' 再次取值: ${await future}'); // 再次从缓存取
31+
32+
// 状态3: Completed with error(已完成,有错误)
33+
var errorFuture = Future.error(Exception('测试错误'));
34+
try {
35+
await errorFuture;
36+
} catch (e) {
37+
print('\n错误Future: $e');
38+
}
39+
// 错误也被缓存!
40+
try {
41+
await errorFuture; // 同样的错误
42+
} catch (e) {
43+
print('再次获取同样的错误: $e');
44+
}
45+
}
46+
```
47+
48+
49+
```dart
50+
void main() async {
51+
print('开始');
52+
53+
// 并行启动所有Future
54+
var future1 = fetchData(1); // 立即启动,不等待
55+
var future2 = fetchData(2); // 立即启动,不等待
56+
var future3 = fetchData(3); // 立即启动,不等待
57+
58+
var time = DateTime.now();
59+
60+
// 等待所有Future完成
61+
var data1 = await future1;
62+
var data2 = await future2;
63+
var data3 = await future3;
64+
65+
print('结果: $data1, $data2, $data3');
66+
print('总耗时: ${(DateTime.now()).difference(time).inSeconds}秒');
67+
}
68+
69+
Future<String> fetchData(int index) {
70+
print('开始获取数据$index, 当前时间: ${DateTime.now()}');
71+
return Future.delayed(Duration(seconds: 10), () {
72+
// 模拟网络请求
73+
return '从服务器获取的数据$index';
74+
// 抛出异常模拟错误
75+
// throw Exception('网络错误');
76+
});
77+
}
78+
```
79+
80+
81+
82+
输出结果:
83+
84+
```shell
85+
开始
86+
开始获取数据1, 当前时间: 2025-12-03 20:30:52.643714
87+
开始获取数据2, 当前时间: 2025-12-03 20:30:52.655745
88+
开始获取数据3, 当前时间: 2025-12-03 20:30:52.656121
89+
结果: 从服务器获取的数据1, 从服务器获取的数据2, 从服务器获取的数据3
90+
总耗时: 10秒
91+
92+
Exited.
93+
```
94+
95+
96+
97+
```dart
98+
void main() async {
99+
print('1. main开始');
100+
101+
// 这3个Future立即进入"微任务队列"
102+
var future1 = fetchData(1);
103+
var future2 = fetchData(2);
104+
var future3 = fetchData(3);
105+
106+
print('2. Future已创建,但未等待');
107+
108+
// 没有await,main函数继续执行
109+
print('3. main继续执行');
110+
111+
// main函数结束,但程序不会立即退出
112+
// 因为还有未完成的Future
113+
print('4. main结束');
114+
115+
// 注意:即使main函数结束,Future仍在后台执行
116+
// 但程序会等待所有未完成的Future吗?看下面的测试
117+
}
118+
119+
Future<String> fetchData(int index) {
120+
print('开始获取数据$index');
121+
return Future.delayed(Duration(seconds: 2), () {
122+
print('数据$index完成'); // 这个还会执行吗?
123+
return '数据$index';
124+
});
125+
}
126+
```
127+
128+
129+
130+
输出结果:
131+
132+
```shell
133+
1. main开始
134+
开始获取数据1
135+
开始获取数据2
136+
开始获取数据3
137+
2. Future已创建,但未等待
138+
3. main继续执行
139+
4. main结束
140+
数据1完成
141+
数据2完成
142+
数据3完成
143+
144+
Exited.
145+
```
146+

0 commit comments

Comments
 (0)