@@ -13,67 +13,63 @@ import 'package:veggieseasons/styles.dart';
13
13
import 'package:veggieseasons/widgets/veggie_card.dart' ;
14
14
15
15
class ListScreen extends StatelessWidget {
16
- List <Widget > _generateVeggieRows (List <Veggie > veggies, Preferences prefs,
17
- {bool inSeason = true }) {
18
- final cards = List <Widget >();
19
-
20
- for (Veggie veggie in veggies) {
21
- cards.add (Padding (
22
- padding: EdgeInsets .only (left: 16.0 , right: 16.0 , bottom: 24.0 ),
23
- child: FutureBuilder <Set <VeggieCategory >>(
24
- future: prefs.preferredCategories,
25
- builder: (context, snapshot) {
26
- final data = snapshot.data ?? Set <VeggieCategory >();
27
- return VeggieCard (
28
- veggie, inSeason, data.contains (veggie.category));
29
- }),
30
- ));
31
- }
32
-
33
- return cards;
16
+ Widget _generateVeggieRow (veggie, Preferences prefs, {bool inSeason = true }) {
17
+ return Padding (
18
+ padding: EdgeInsets .only (left: 16 , right: 16 , bottom: 24 ),
19
+ child: FutureBuilder <Set <VeggieCategory >>(
20
+ future: prefs.preferredCategories,
21
+ builder: (context, snapshot) {
22
+ final data = snapshot.data ?? Set <VeggieCategory >();
23
+ return VeggieCard (veggie, inSeason, data.contains (veggie.category));
24
+ }),
25
+ );
34
26
}
35
27
36
28
@override
37
29
Widget build (BuildContext context) {
38
30
return CupertinoTabView (
39
31
builder: (context) {
40
32
String dateString = DateFormat ("MMMM y" ).format (DateTime .now ());
33
+
41
34
final appState =
42
35
ScopedModel .of <AppState >(context, rebuildOnChange: true );
43
36
final prefs =
44
37
ScopedModel .of <Preferences >(context, rebuildOnChange: true );
45
38
46
- final rows = < Widget > [];
47
-
48
- rows.add (
49
- Padding (
50
- padding: const EdgeInsets .fromLTRB (16.0 , 24.0 , 16.0 , 16.0 ),
51
- child: Column (
52
- crossAxisAlignment: CrossAxisAlignment .start,
53
- children: [
54
- Text (dateString.toUpperCase (), style: Styles .minorText),
55
- Text ('In season today' , style: Styles .headlineText),
56
- ],
57
- ),
58
- ),
59
- );
60
-
61
- rows.addAll (_generateVeggieRows (appState.availableVeggies, prefs));
62
-
63
- rows.add (
64
- Padding (
65
- padding: const EdgeInsets .fromLTRB (16.0 , 24.0 , 16.0 , 16.0 ),
66
- child: Text ('Not in season' , style: Styles .headlineText),
67
- ),
68
- );
69
-
70
- rows.addAll (_generateVeggieRows (appState.unavailableVeggies, prefs,
71
- inSeason: false ));
72
-
73
39
return DecoratedBox (
74
40
decoration: BoxDecoration (color: Color (0xffffffff )),
75
- child: ListView (
76
- children: rows,
41
+ child: ListView .builder (
42
+ itemCount: appState.allVeggies.length + 2 ,
43
+ itemBuilder: (context, index) {
44
+ if (index == 0 ) {
45
+ return Padding (
46
+ padding: const EdgeInsets .fromLTRB (16 , 24 , 16 , 16 ),
47
+ child: Column (
48
+ crossAxisAlignment: CrossAxisAlignment .start,
49
+ children: [
50
+ Text (dateString.toUpperCase (), style: Styles .minorText),
51
+ Text ('In season today' , style: Styles .headlineText),
52
+ ],
53
+ ),
54
+ );
55
+ } else if (index <= appState.availableVeggies.length) {
56
+ return _generateVeggieRow (
57
+ appState.availableVeggies[index - 1 ],
58
+ prefs,
59
+ );
60
+ } else if (index <= appState.availableVeggies.length + 1 ) {
61
+ return Padding (
62
+ padding: const EdgeInsets .fromLTRB (16 , 24 , 16 , 16 ),
63
+ child: Text ('Not in season' , style: Styles .headlineText),
64
+ );
65
+ } else {
66
+ int relativeIndex =
67
+ index - (appState.availableVeggies.length + 2 );
68
+ return _generateVeggieRow (
69
+ appState.unavailableVeggies[relativeIndex], prefs,
70
+ inSeason: false );
71
+ }
72
+ },
77
73
),
78
74
);
79
75
},
0 commit comments