Skip to content

Commit df13a31

Browse files
committed
Let computed widgets use async
Common pattern in many existing Flutter codebases
1 parent 11a37ab commit df13a31

File tree

2 files changed

+37
-27
lines changed

2 files changed

+37
-27
lines changed

lib/src/computed_flutter.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import 'package:flutter/widgets.dart';
66
class _FlutterComputedImpl extends ComputedImpl<void> {
77
final ComponentElement _element;
88
_FlutterComputedImpl(this._element, void Function() build)
9-
: super(build, false, true, false, null, null);
9+
: super(build, false, false, true, null, null);
1010

1111
@override
1212
Set<Computed> onDependencyUpdated() {

test/widget_test.dart

+36-26
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ void main() {
6565
await tester.pumpWidget(StatelessTestWidget(v, buildCnt));
6666

6767
expect(find.byKey(v.value), findsOneWidget);
68-
expect(buildCnt[0], 2);
68+
expect(buildCnt[0], 1);
6969

7070
var flag1 = false;
7171

@@ -78,18 +78,18 @@ void main() {
7878

7979
expect(flag1, false, reason: 'No unexpected frames');
8080
expect(find.byKey(v.value), findsOneWidget);
81-
expect(buildCnt[0], 2);
81+
expect(buildCnt[0], 1);
8282

8383
v.value = UniqueKey();
8484
await tester.pump();
8585

8686
expect(find.byKey(v.value), findsOneWidget);
87-
expect(buildCnt[0], 4);
87+
expect(buildCnt[0], 2);
8888

8989
await tester.pump();
9090

9191
expect(find.byKey(v.value), findsOneWidget);
92-
expect(buildCnt[0], 4);
92+
expect(buildCnt[0], 2);
9393
});
9494

9595
testWidgets('ComputedStatefulWidget', (tester) async {
@@ -101,39 +101,39 @@ void main() {
101101

102102
expect(find.byKey(v1.value), findsOneWidget);
103103
expect(find.byKey(v2.value), findsOneWidget);
104-
expect(buildCnt[0], 2);
104+
expect(buildCnt[0], 1);
105105

106106
await tester.pump();
107107

108108
expect(find.byKey(v1.value), findsOneWidget);
109109
expect(find.byKey(v2.value), findsOneWidget);
110-
expect(buildCnt[0], 2);
110+
expect(buildCnt[0], 1);
111111

112112
v1.value = UniqueKey();
113113
await tester.pump();
114114

115115
expect(find.byKey(v1.value), findsOneWidget);
116116
expect(find.byKey(v2.value), findsOneWidget);
117-
expect(buildCnt[0], 4);
117+
expect(buildCnt[0], 2);
118118

119119
await tester.pump();
120120

121121
expect(find.byKey(v1.value), findsOneWidget);
122122
expect(find.byKey(v2.value), findsOneWidget);
123-
expect(buildCnt[0], 4);
123+
expect(buildCnt[0], 2);
124124

125125
v2.value = UniqueKey();
126126
await tester.pump();
127127

128128
expect(find.byKey(v1.value), findsOneWidget);
129129
expect(find.byKey(v2.value), findsOneWidget);
130-
expect(buildCnt[0], 6);
130+
expect(buildCnt[0], 3);
131131

132132
await tester.pump();
133133

134134
expect(find.byKey(v1.value), findsOneWidget);
135135
expect(find.byKey(v2.value), findsOneWidget);
136-
expect(buildCnt[0], 6);
136+
expect(buildCnt[0], 3);
137137
});
138138

139139
testWidgets('ComputedBuilder', (tester) async {
@@ -146,23 +146,23 @@ void main() {
146146
}));
147147

148148
expect(find.byKey(v.value), findsOneWidget);
149-
expect(buildCnt[0], 2);
149+
expect(buildCnt[0], 1);
150150

151151
await tester.pump();
152152

153153
expect(find.byKey(v.value), findsOneWidget);
154-
expect(buildCnt[0], 2);
154+
expect(buildCnt[0], 1);
155155

156156
v.value = UniqueKey();
157157
await tester.pump();
158158

159159
expect(find.byKey(v.value), findsOneWidget);
160-
expect(buildCnt[0], 4);
160+
expect(buildCnt[0], 2);
161161

162162
await tester.pump();
163163

164164
expect(find.byKey(v.value), findsOneWidget);
165-
expect(buildCnt[0], 4);
165+
expect(buildCnt[0], 2);
166166
});
167167

168168
testWidgets('widgets are built at build() time', (tester) async {
@@ -198,27 +198,27 @@ void main() {
198198
}));
199199

200200
expect(find.byKey(v.value), findsOneWidget);
201-
expect(buildCnt[0], 2);
202-
expect(buildCnt[1], 2);
201+
expect(buildCnt[0], 1);
202+
expect(buildCnt[1], 1);
203203

204204
await tester.pump();
205205

206206
expect(find.byKey(v.value), findsOneWidget);
207-
expect(buildCnt[0], 2);
208-
expect(buildCnt[1], 2);
207+
expect(buildCnt[0], 1);
208+
expect(buildCnt[1], 1);
209209

210210
v.value = UniqueKey();
211211
await tester.pump();
212212

213213
expect(find.byKey(v.value), findsOneWidget);
214-
expect(buildCnt[0], 4);
215-
expect(buildCnt[1], 4);
214+
expect(buildCnt[0], 2);
215+
expect(buildCnt[1], 2);
216216

217217
await tester.pump();
218218

219219
expect(find.byKey(v.value), findsOneWidget);
220-
expect(buildCnt[0], 4);
221-
expect(buildCnt[1], 4);
220+
expect(buildCnt[0], 2);
221+
expect(buildCnt[1], 2);
222222
});
223223

224224
testWidgets('swapping widgets on the same element works', (tester) async {
@@ -236,18 +236,18 @@ void main() {
236236
await tester.pumpWidget(builder());
237237

238238
expect(find.byKey(v.value), findsOneWidget);
239-
expect(buildCnt[0], 2);
239+
expect(buildCnt[0], 1);
240240

241241
await tester.pumpWidget(builder());
242242

243243
expect(find.byKey(v.value), findsOneWidget);
244-
expect(buildCnt[0], 4);
244+
expect(buildCnt[0], 2);
245245

246246
v.value = UniqueKey();
247247
await tester.pump();
248248

249249
expect(find.byKey(v.value), findsOneWidget);
250-
expect(buildCnt[0], 6);
250+
expect(buildCnt[0], 3);
251251
});
252252

253253
testWidgets('throwing computation throws during widget build',
@@ -275,7 +275,7 @@ void main() {
275275

276276
FlutterError.onError = null;
277277

278-
expect(buildCnt[0], 2);
278+
expect(buildCnt[0], 1);
279279
expect(flag, true);
280280
} finally {
281281
FlutterError.onError = originalOnError;
@@ -297,4 +297,14 @@ void main() {
297297

298298
expect(controller.hasListener, false);
299299
});
300+
301+
testWidgets('computed widgets can use async', (tester) async {
302+
final key = UniqueKey();
303+
await tester.pumpWidget(ComputedBuilder(builder: (ctx) {
304+
Future.value().then((_) {});
305+
return SizedBox.shrink(key: key);
306+
}));
307+
308+
expect(find.byKey(key), findsOneWidget);
309+
});
300310
}

0 commit comments

Comments
 (0)