How will you build the application in part 1?
Your application will be a simple application, generating proposed names for a start up company. Users can select and unselect their names, saving their favorite names. The App will create names slowly. When user scroll, more names will be created, unlimited.
Step 1: Create a Flutter app
Create a basic Flutter application based on an existing template, named startup_namer instead of myapp
- Change the code in lib / main.dart .
Delete all the code in lib / main.dart , replace it with the following code. Display “Hello World” in the middle of the screen.
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 | <span class="token comment">// Copyright 2018 The Flutter team. All rights reserved.</span> <span class="token comment">// Use of this source code is governed by a BSD-style license that can be</span> <span class="token comment">// found in the LICENSE file.</span> <span class="token keyword">import</span> <span class="token string">'package:flutter/material.dart'</span> <span class="token punctuation">;</span> <span class="token keyword">void</span> <span class="token function">main</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token function">runApp</span> <span class="token punctuation">(</span> <span class="token function">MyApp</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">MyApp</span> <span class="token keyword">extends</span> <span class="token class-name">StatelessWidget</span> <span class="token punctuation">{</span> <span class="token metadata symbol">@override</span> Widget <span class="token function">build</span> <span class="token punctuation">(</span> BuildContext context <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">MaterialApp</span> <span class="token punctuation">(</span> title <span class="token punctuation">:</span> <span class="token string">'Welcome to Flutter'</span> <span class="token punctuation">,</span> home <span class="token punctuation">:</span> <span class="token function">Scaffold</span> <span class="token punctuation">(</span> appBar <span class="token punctuation">:</span> <span class="token function">AppBar</span> <span class="token punctuation">(</span> title <span class="token punctuation">:</span> <span class="token function">Text</span> <span class="token punctuation">(</span> <span class="token string">'Welcome to Flutter'</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> body <span class="token punctuation">:</span> <span class="token function">Center</span> <span class="token punctuation">(</span> child <span class="token punctuation">:</span> <span class="token function">Text</span> <span class="token punctuation">(</span> <span class="token string">'Hello World'</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- Run the application. You can see both Android and iOS as follows, depending on the device you use.
Observe
- This example creates a Material application. Material is an intuitive design language that comes standard on mobile and web devices. Flutter offers a rich set of Material.
- The main () method uses the arrow symbol (=>). Use arrow symbols for single line functions or methods.
- The StatlessWidget extend application makes the application a widget. In Flutter, almost everything is a widget, including alignment, padding and layout.
- The Scaffold widget, from the Material library, provides a default application bar, title, and body attribute that holds the widget tree for the home screen. Widgets can be quite complex.
- The main task of the widget is to provide a build () method that describes how to display widgets according to other, lower-level gadgets.
- The body of this example includes a Center widget that contains the Text child widget. Widget Center aligns the widget to the center of the screen.
Step 2: Use external package
In this step, you will start using the open package named english_words , containing a few thousand English words most used along with some utility functions.
You can find the english_words package, as well as many other open source packages, on pub.dev .
- The pubspec file manages assets and dependencies for the Flutter application. In pubspec.yaml , add english_words (3.1.0 or higher) to the list of dependencies:
1 2 3 4 5 6 7 | dependencies <span class="token punctuation">:</span> flutter <span class="token punctuation">:</span> sdk <span class="token punctuation">:</span> flutter cupertino_icons <span class="token punctuation">:</span> <span class="token operator">^</span> <span class="token number">0.1</span> <span class="token number">.2</span> english_words <span class="token punctuation">:</span> <span class="token operator">^</span> <span class="token number">3.1</span> <span class="token number">.0</span> # add <span class="token keyword">this</span> line |
- While viewing pubspec in the editor view of Android Studio, click Packages get . This will drag the package into your project. You should see the following in the control panel:
1 2 3 4 | flutter pub get Running <span class="token string">"flutter pub get"</span> in startup_namer <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> Process finished with exit code <span class="token number">0</span> |
The Packages get implementation also automatically creates a pubspec.lock file with a list of all packages that are pulled into the project and their versions.
- In lib / main.dart , import the package:
1 2 3 | <span class="token keyword">import</span> <span class="token string">'package:flutter/material.dart'</span> <span class="token punctuation">;</span> <span class="token keyword">import</span> <span class="token string">'package:english_words/english_words.dart'</span> <span class="token punctuation">;</span> |
As you type, Android Studio gives you suggestions for libraries to import. It then outputs the gray input string, letting you know that the imported library has not been used (until now).
- Use English words to create text instead of using “Hello World”:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <span class="token keyword">import</span> <span class="token string">'package:flutter/material.dart'</span> <span class="token punctuation">;</span> <span class="token keyword">import</span> <span class="token string">'package:english_words/english_words.dart'</span> <span class="token punctuation">;</span> <span class="token keyword">void</span> <span class="token function">main</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token function">runApp</span> <span class="token punctuation">(</span> <span class="token function">MyApp</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">MyApp</span> <span class="token keyword">extends</span> <span class="token class-name">StatelessWidget</span> <span class="token punctuation">{</span> <span class="token metadata symbol">@override</span> Widget <span class="token function">build</span> <span class="token punctuation">(</span> BuildContext context <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">final</span> wordPair <span class="token operator">=</span> WordPair <span class="token punctuation">.</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Add this line.</span> <span class="token keyword">return</span> <span class="token function">MaterialApp</span> <span class="token punctuation">(</span> title <span class="token punctuation">:</span> <span class="token string">'Welcome to Flutter'</span> <span class="token punctuation">,</span> home <span class="token punctuation">:</span> <span class="token function">Scaffold</span> <span class="token punctuation">(</span> appBar <span class="token punctuation">:</span> <span class="token function">AppBar</span> <span class="token punctuation">(</span> title <span class="token punctuation">:</span> <span class="token function">Text</span> <span class="token punctuation">(</span> <span class="token string">'Welcome to Flutter'</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> body <span class="token punctuation">:</span> <span class="token function">Center</span> <span class="token punctuation">(</span> <span class="token comment">//child: Text('Hello World'), // Replace this text...</span> child <span class="token punctuation">:</span> <span class="token function">Text</span> <span class="token punctuation">(</span> wordPair <span class="token punctuation">.</span> asPascalCase <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token comment">// With this text.</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- If the application is running, please hot reload to update the running application. Every time you click on hot reload or save the project, you will see a different, randomly chosen word pair in the running application. This is because the compound word created inside the build method, is run whenever MaterialApp requires rendering or when converting Platform in Flutter Inspector.
Step 3: Add Stateful widget
Stateless widgets are immutable, meaning their properties cannot be changed, all values are final.
Stateful widgets are state maintainable state that can change throughout the life of the widget. The implementation of a Stateful widget requires at least two classes: 1) a StatefulWidget class creates an instance of 2) a State class. The StatefulWidget class itself is immutable, but the State class persists throughout the widget’s lifecycle.
In this step, you will add a stateful widget, RandomWords , create its State class, RandomWordsState . You will then use RandomWords as the child within the existing stateless widget MyApp .
- Create a state class. minimum. Add the following to the bottom of main.dart :
1 2 3 4 | <span class="token keyword">class</span> <span class="token class-name">RandomWordsState</span> <span class="token keyword">extends</span> <span class="token class-name">State</span> <span class="token generics function"><span class="token punctuation"><</span> RandomWords <span class="token punctuation">></span></span> <span class="token punctuation">{</span> <span class="token comment">// TODO Add build() method</span> <span class="token punctuation">}</span> |
Note the State <RandomWords> declaration . This indicates that we use the same State class for RandomWords . Most of the application and states logic is located here, which maintains the status for the RandomWords widget. This class stores pairs of words that are created, infinitely growing as users scroll and favorite word pairs (in part 2), when users add or remove them from the list by turning on the heart icon.
RandomWordsState depends on the RandomWords class. You will add that next.
- Add stateful RandomWords widget to main.dart. The RandomWords widget does nothing more than create its State class:
1 2 3 4 5 | <span class="token keyword">class</span> <span class="token class-name">RandomWords</span> <span class="token keyword">extends</span> <span class="token class-name">StatefulWidget</span> <span class="token punctuation">{</span> <span class="token metadata symbol">@override</span> RandomWordsState <span class="token function">createState</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token function">RandomWordsState</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
After adding the state class, the IDE will report that the class lacks a build method. Next, you’ll add a basic build method to generate word pairs by moving the code generated from MyApp to RandomWordsState.
- Add build method to RandomWordsState, as shown below:
1 2 3 4 5 6 7 8 | <span class="token keyword">class</span> <span class="token class-name">RandomWordsState</span> <span class="token keyword">extends</span> <span class="token class-name">State</span> <span class="token operator"><</span> RandomWords <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token metadata symbol">@override</span> <span class="token comment">// Add from this line ... </span> Widget <span class="token function">build</span> <span class="token punctuation">(</span> BuildContext context <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">final</span> WordPair wordPair <span class="token operator">=</span> WordPair <span class="token punctuation">.</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">Text</span> <span class="token punctuation">(</span> wordPair <span class="token punctuation">.</span> asPascalCase <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// ... to this line.</span> <span class="token punctuation">}</span> |
- Remove the code generated from MyApp by making the following changes:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token keyword">class</span> <span class="token class-name">MyApp</span> <span class="token keyword">extends</span> <span class="token class-name">StatelessWidget</span> <span class="token punctuation">{</span> <span class="token metadata symbol">@override</span> Widget <span class="token function">build</span> <span class="token punctuation">(</span> BuildContext context <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">final</span> WordPair wordPair <span class="token operator">=</span> WordPair <span class="token punctuation">.</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Delete this line.</span> <span class="token keyword">return</span> <span class="token function">MaterialApp</span> <span class="token punctuation">(</span> title <span class="token punctuation">:</span> <span class="token string">'Welcome to Flutter'</span> <span class="token punctuation">,</span> home <span class="token punctuation">:</span> <span class="token function">Scaffold</span> <span class="token punctuation">(</span> appBar <span class="token punctuation">:</span> <span class="token function">AppBar</span> <span class="token punctuation">(</span> title <span class="token punctuation">:</span> <span class="token function">Text</span> <span class="token punctuation">(</span> <span class="token string">'Welcome to Flutter'</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> body <span class="token punctuation">:</span> <span class="token function">Center</span> <span class="token punctuation">(</span> <span class="token comment">//child: Text(wordPair.asPascalCase), // Change this line to... </span> child <span class="token punctuation">:</span> <span class="token function">RandomWords</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token comment">// ... this line.</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- Hot reload app. The App will work as before, displaying a compound word whenever you reload or save the project.
Step 4: Create an infinite ListView scroll
In this step, you’ll expand RandomWordsState to create and display a list of compound words. As the user scrolls, the list (displayed in the ListView widget) will grow indefinitely. ListView’s factory builder constructor allows you to build a lazy list view, as required.
- Add to the list _suggestions RandomWordsState class to save the proposed compound. Also, add a _biggerFont variable to make the font size bigger.
1 2 3 4 5 6 7 | <span class="token keyword">class</span> <span class="token class-name">RandomWordsState</span> <span class="token keyword">extends</span> <span class="token class-name">State</span> <span class="token operator"><</span> RandomWords <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token comment">// Add the next two lines.</span> <span class="token keyword">final</span> List <span class="token operator"><</span> WordPair <span class="token operator">></span> _suggestions <span class="token operator">=</span> <span class="token operator"><</span> WordPair <span class="token operator">></span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token keyword">final</span> TextStyle _biggerFont <span class="token operator">=</span> <span class="token keyword">const</span> <span class="token function">TextStyle</span> <span class="token punctuation">(</span> fontSize <span class="token punctuation">:</span> <span class="token number">18</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">}</span> |
Next, you’ll add the _buildSuggestions () function to the RandomWordsState class. This method will build ListView showing the suggested word match.
The ListView class provides a builder, itemBuilder property , that is the factory builder function and the callback function specified as an anonymous function. The two parameters passed to the function are BuildContext and iterator row, i. The loop starts at 0 and increments each time the function is called once for each proposed word coupling. This model allows the list of suggestions to grow indefinitely as the user scrolls.
- Add the entire _buildSuggestions function, shown below, into the RandomWordsState class:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | Widget <span class="token function">_buildSuggestions</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> ListView <span class="token punctuation">.</span> <span class="token function">builder</span> <span class="token punctuation">(</span> padding <span class="token punctuation">:</span> <span class="token keyword">const</span> EdgeInsets <span class="token punctuation">.</span> <span class="token function">all</span> <span class="token punctuation">(</span> <span class="token number">16</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> itemBuilder <span class="token punctuation">:</span> <span class="token punctuation">(</span> BuildContext _context <span class="token punctuation">,</span> int i <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> i <span class="token punctuation">.</span> isOdd <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">Divider</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">final</span> int index <span class="token operator">=</span> i <span class="token operator">~/</span> <span class="token number">2</span> <span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> index <span class="token operator">>=</span> _suggestions <span class="token punctuation">.</span> length <span class="token punctuation">)</span> <span class="token punctuation">{</span> _suggestions <span class="token punctuation">.</span> <span class="token function">addAll</span> <span class="token punctuation">(</span> <span class="token function">generateWordPairs</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">take</span> <span class="token punctuation">(</span> <span class="token number">10</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token function">_buildRow</span> <span class="token punctuation">(</span> _suggestions <span class="token punctuation">[</span> index <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
The _buildSuggestions function calls _buildRow once for each word pair. This function displays each new folder in ListTile.
- Add the _buildRow function to RandomWordsState:
1 2 3 4 5 6 7 8 9 | Widget <span class="token function">_buildRow</span> <span class="token punctuation">(</span> WordPair pair <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">ListTile</span> <span class="token punctuation">(</span> title <span class="token punctuation">:</span> <span class="token function">Text</span> <span class="token punctuation">(</span> pair <span class="token punctuation">.</span> asPascalCase <span class="token punctuation">,</span> style <span class="token punctuation">:</span> _biggerFont <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
- Update the build method for RandomWordsState to use _buildSuggestions () , instead of calling the word creation library directly. ( Scaffold implements basic Material Design visual layout.)
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token metadata symbol">@override</span> Widget <span class="token function">build</span> <span class="token punctuation">(</span> BuildContext context <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//final wordPair = WordPair.random(); // Delete these... </span> <span class="token comment">//return Text(wordPair.asPascalCase); // ... two lines.</span> <span class="token keyword">return</span> Scaffold <span class="token punctuation">(</span> <span class="token comment">// Add from here... </span> appBar <span class="token punctuation">:</span> <span class="token function">AppBar</span> <span class="token punctuation">(</span> title <span class="token punctuation">:</span> <span class="token function">Text</span> <span class="token punctuation">(</span> <span class="token string">'Startup Name Generator'</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> body <span class="token punctuation">:</span> <span class="token function">_buildSuggestions</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// ... to here.</span> <span class="token punctuation">}</span> |
- Update the MyApp build method, change the title and set the home to a RandomWords widget:
1 2 3 4 5 6 7 8 | <span class="token metadata symbol">@override</span> Widget <span class="token function">build</span> <span class="token punctuation">(</span> BuildContext context <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">MaterialApp</span> <span class="token punctuation">(</span> title <span class="token punctuation">:</span> <span class="token string">'Startup Name Generator'</span> <span class="token punctuation">,</span> home <span class="token punctuation">:</span> <span class="token function">RandomWords</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
- Restart app. The following results:
That’s it part 1 of this app. Part 2 we will add a bit more as follows:
- More interaction.
- Add the ability to navigate to a new screen.
- Change theme colors.
Demo:
Thank you for reading my post