-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.dart
153 lines (140 loc) · 4.8 KB
/
main.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import 'package:english_words/english_words.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
/// The app extends StatelessWidget, which makes the app itself a widget
/// The Scaffold widget, from the Material library, provides a defaut app bar, a title, and a body
/// Property that holds the widget tree for the home screen.
/// Awidget's main job is to provide a build method that describes how to display the widget in
/// terms of other. lower-level widgets.
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Startup Name Generator',
theme: ThemeData(
appBarTheme: const AppBarTheme(
backgroundColor: Colors.lightGreen,
foregroundColor: Colors.white,
),
),
home: const RandomWords(),
);
}
}
/// Boiler plate code for a stateful widget
class RandomWords extends StatefulWidget {
const RandomWords({Key? key}) : super(key: key);
@override
State<RandomWords> createState() => _RandomWordsState();
}
class _RandomWordsState extends State<RandomWords> {
// for saving suggested word pairing
final _suggestions = <WordPair>[];
// The set stores word pairing that the user favorited
// Set is preferred to List because a properly implemented Set doesn't allow duplicate entries
final _saved = <WordPair>{};
// for making the font size larger
final _biggerFont = const TextStyle(fontSize: 18);
Widget _buildRow(WordPair pair) {
// alreadySaved checks to ensure that a word pairing has not already been added to favorites
final alreadySaved = _saved.contains(pair);
return ListTile(
title: Text(
pair.asPascalCase,
style: _biggerFont,
),
// add heart-shaped icons after the text
trailing: Icon(
alreadySaved ? Icons.favorite : Icons.favorite_border,
color: alreadySaved ? Colors.red : null,
semanticLabel: alreadySaved ? 'Remove from saved' : 'Save',
),
onTap: () {
setState(() {
if (alreadySaved) {
_saved.remove(pair);
} else {
_saved.add(pair);
}
});
},
);
}
Widget _buildSuggestions() {
return ListView.builder(
padding: const EdgeInsets.all(16),
// The itemBuilder callback is called once per suggested word pairing,
// and places each suggestion into a ListTile row.
// For even rows, the function adds a ListTile row for the word pairing
// For odd rows, the function adds a Divider widget to visually separate the entries.
// Note that the divider may be difficult to see on smaller devices.
itemBuilder: (context, i) {
// Add a one-pixel-high divider widget before each row in the ListView
if (i.isOdd) {
return const Divider();
}
// The syntax "i ~/ 2" divides i by 2 and returns an integer result.
// for example: 1, 2, 3, 4, 5 becomes 0, 1, 1, 2, 2.
// This calculates the actual number of word pairings in the ListView, minus the divider widgets.
final index = i ~/ 2;
// if you've reached the end of the available word pairings
if (index >= _suggestions.length) {
// ... then generate 10 more and add them to the suggestions list
_suggestions.addAll(generateWordPairs().take(10));
}
return _buildRow(_suggestions[index]);
});
}
/// changes the screen to display the new route
void _pushSaved() {
// push the route to the Navigator's stack
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) {
final tiles = _saved.map(
(pair) {
return ListTile(
title: Text(
pair.asPascalCase,
style: _biggerFont,
),
);
},
);
final divided = tiles.isNotEmpty
? ListTile.divideTiles(
context: context,
tiles: tiles,
).toList()
: <Widget>[];
return Scaffold(
appBar: AppBar(
title: const Text('Saved Suggestions'),
),
body: ListView(children: divided),
);
},
),
);
}
@override
Widget build(BuildContext context) {
// Scaffold implements the the basic Material Design visual layout
return Scaffold(
appBar: AppBar(
title: const Text('Startup Name Generator'),
actions: [
IconButton(
icon: const Icon(Icons.list),
onPressed: _pushSaved,
tooltip: 'Saved Suggestions',
),
],
),
body: _buildSuggestions(),
);
}
}