11import 'package:flutter/widgets.dart' ;
22
3- class EnhancedFutureBuilder extends StatefulWidget {
3+ class EnhancedFutureBuilder < T > extends StatefulWidget {
44 /// Future to resolve.
5- final Future future;
5+ final Future <T > future;
6+
67 /// Whether or not the future result should be stored.
78 final bool rememberFutureResult;
9+
810 /// Widget to display when connected to an asynchronous computation.
911 final Widget whenActive;
12+
1013 /// Widget to display when connected to an asynchronous computation and awaiting interaction.
1114 final Widget whenWaiting;
15+
1216 /// Widget to display when not connected to n asynchronous computation.
1317 final Widget whenNone;
18+
1419 /// Widget to display when the asynchronous computation is not done yet.
1520 final Widget whenNotDone;
21+
1622 /// Function to call when the asynchronous computation is done.
17- final Widget Function (dynamic snapshotData) whenDone;
23+ final Widget Function (T snapshotData) whenDone;
24+
25+ /// Function to call when the asynchronous computation is done with error.
26+ /// If no function is passed, whenNotDone() will be used instead
27+ final Widget Function (Object error) whenError;
28+
1829 /// The data that will be used until a non-null [future] has completed.
1930 ///
2031 /// See [FutureBuilder] for more info
21- final dynamic initialData;
22-
23- const EnhancedFutureBuilder ({
24- Key key,
25- @required this .future,
26- @required this .rememberFutureResult,
27- @required this .whenDone,
28- this .whenActive,
29- this .whenNotDone,
30- this .whenNone,
31- this .whenWaiting,
32- this .initialData
33- }) :
34- assert (future != null ),
35- assert (rememberFutureResult != null ),
36- assert (whenDone != null ),
37- super (key: key);
32+ final T initialData;
33+
34+ const EnhancedFutureBuilder (
35+ {Key key,
36+ @required this .future,
37+ @required this .rememberFutureResult,
38+ @required this .whenDone,
39+ @required this .whenNotDone,
40+ this .whenError,
41+ this .whenActive,
42+ this .whenNone,
43+ this .whenWaiting,
44+ this .initialData})
45+ : assert (future != null ),
46+ assert (rememberFutureResult != null ),
47+ assert (whenDone != null ),
48+ assert (whenNotDone != null ),
49+ super (key: key);
3850
3951 @override
40- _EnhancedFutureBuilderState createState () => _EnhancedFutureBuilderState ();
52+ _EnhancedFutureBuilderState createState () => _EnhancedFutureBuilderState < T > ();
4153}
4254
43- class _EnhancedFutureBuilderState extends State <EnhancedFutureBuilder > {
44-
45- Future _cachedFuture;
55+ class _EnhancedFutureBuilderState <T > extends State <EnhancedFutureBuilder <T >> {
56+ Future <T > _cachedFuture;
4657
47- @override
58+ @override
4859 void initState () {
4960 super .initState ();
5061 _cachedFuture = this .widget.future;
5162 }
5263
5364 @override
5465 Widget build (BuildContext context) {
55- return FutureBuilder (
56- future: this .widget.rememberFutureResult ? _cachedFuture : this .widget.future,
66+ return FutureBuilder <T >(
67+ future:
68+ this .widget.rememberFutureResult ? _cachedFuture : this .widget.future,
5769 initialData: this .widget.initialData,
58- builder: (BuildContext context, snapshot) {
59- if (this .widget.whenActive != null && snapshot.connectionState == ConnectionState .active) {
70+ builder: (context, snapshot) {
71+ if (this .widget.whenActive != null &&
72+ snapshot.connectionState == ConnectionState .active) {
6073 return this .widget.whenActive;
6174 }
62-
63- if (this .widget.whenNone != null && snapshot.connectionState == ConnectionState .none) {
75+
76+ if (this .widget.whenNone != null &&
77+ snapshot.connectionState == ConnectionState .none) {
6478 return this .widget.whenNone;
6579 }
66-
67- if (this .widget.whenWaiting != null && snapshot.connectionState == ConnectionState .waiting) {
80+
81+ if (this .widget.whenWaiting != null &&
82+ snapshot.connectionState == ConnectionState .waiting) {
6883 return this .widget.whenWaiting;
6984 }
7085
7186 if (snapshot.connectionState == ConnectionState .done) {
87+ if (snapshot.hasError) {
88+ if (this .widget.whenError != null ) {
89+ return this .widget.whenError (snapshot.error);
90+ } else {
91+ return this .widget.whenNotDone;
92+ }
93+ }
7294 return this .widget.whenDone (snapshot.data);
7395 }
7496
75- if (this .widget.whenNotDone != null && snapshot.connectionState != ConnectionState .done) {
76- return this .widget.whenNotDone;
77- }
97+ return this .widget.whenNotDone;
7898 },
7999 );
80100 }
81- }
101+ }
0 commit comments