Creating User Interfaces with Flutter

1 App Development

1.1 Blank App

    import 'package:flutter/material.dart';
    
    // Program execution starts here
    void main(){
        // run our app which is a MaterialApp
        // This allows us to use Material Design
        // MaterialApp is a very good choice for Android
        runApp(MaterialApp(
        // The home parameter specifies the screen we want to show
            home: Home(),
        ));
    }
    
    // This is the screen we want to develop
    // It inherits from StatelessWidget
    // In this example, we use StatelessWidget,
    // in future, we see Stateful Widget.
    class Home extends StatelessWidget{
        // BuildContext is an object that represents the location of a widget in the widget tree.
        // It allows a widget to access information about its parent, child, and surrounding context.
        @override
        Widget build(BuildContext context)
        {
            // This holds everything inside the widget
            return Scaffold(
            );
        }
    }

App Screen

1.2 Adding an App Bar

    import 'package:flutter/material.dart'; 
    
    void main(){        
        runApp(MaterialApp(     
            home: Home(),
        ));
    }   
    
    class Home extends StatelessWidget{      
        @override
        Widget build(BuildContext context)
        {           
            return Scaffold(
            // Inside the Scaffold, we can continue building our widget tree,
            // we add an AppBar
            appBar: AppBar(
                title: const Text('Page Title'),
                centerTitle: true,
                backgroundColor: Colors.blue[500],
            ),
            );
        }
    }

App Screen

1.3 Adding a Text Widget to the Body of the Scaffold

    import 'package:flutter/material.dart'; 
    
    void main(){        
        runApp(MaterialApp(     
            home: Home(),
        ));
    }   
    
    class Home extends StatelessWidget{      
        @override
        Widget build(BuildContext context)
        {           
            return Scaffold(
            appBar: AppBar(
                title: const Text('Page Title'),
                centerTitle: true,
                backgroundColor: Colors.blue[500],
            ),
            // Add a Text widget to the body of the of Scaffold
            body: Text('Hello!'),
            );
        }
    }

App Screen

1.4 Centering the Added Text Widget

    import 'package:flutter/material.dart'; 
    
    void main(){        
        runApp(MaterialApp(     
            home: Home(),
        ));
    }   
    
    class Home extends StatelessWidget{      
        @override
        Widget build(BuildContext context)
        {           
            return Scaffold(
            appBar: AppBar(
            title: const Text('Page Title'),
            centerTitle: true,
            backgroundColor: Colors.blue[500],
            ),
            // Add a Center widget to the body
            // It will center everything inside it
            body: Center(
                // Nested widgets are added using the parameter child
                child: Text('Hello!'),
            ),
            );
        }
    }

App Screen

1.5 Changing the Text Styling

Go to https://api.flutter.dev/flutter/widgets/Text-class.html and explore the different options we have. The following is an extract of what can be used.

  • maxLines int?
    An optional maximum number of lines for the text to span, wrapping if necessary. If the text exceeds the given number of lines, it will be truncated according to overflow.

  • overflow TextOverflow?
    How visual overflow should be handled.

  • selectionColor Color?
    The color to use when painting the selection.

  • softWrap bool?
    Whether the text should break at soft line breaks.

  • strutStyle StrutStyle?
    The strut style to use. Strut style defines the strut, which sets minimum vertical layout metrics.

  • style TextStyle?
    If non-null, the style to use for this text.

  • textAlign TextAlign?
    How the text should be aligned horizontally.

  • textDirection TextDirection?
    The directionality of the text.

Let’s say I want to use the style attribute, the documentation says it should be of type TextStyle. So let us see what TextStyle has to offer.

  • background Paint?
    The paint drawn as a background for the text.

  • backgroundColor Color?
    The color to use as the background for the text.

  • color Color?
    The color to use when painting the text.

  • debugLabel String?
    A human-readable description of this text style.

  • decoration TextDecoration?
    The decorations to paint near the text (e.g., an underline).

  • decorationColor Color?
    The color in which to paint the text decorations.

  • decorationStyle TextDecorationStyle?
    The style in which to paint the text decorations (e.g., dashed).

  • decorationThickness double?
    The thickness of the decoration stroke as a multiplier of the thickness defined by the font.

  • fontFamily String?
    The name of the font to use when painting the text (e.g., Roboto).

  • fontFamilyFallback List<String>?
    The ordered list of font families to fall back on when a glyph cannot be found in a higher priority font family.

  • fontFeatures List<FontFeature>?
    A list of FontFeatures that affect how the font selects glyphs.

  • fontSize double?
    The size of fonts (in logical pixels) to use when painting the text.

  • fontStyle FontStyle?
    The typeface variant to use when drawing the letters (e.g., italics).

  • fontVariations List<FontVariation>?
    A list of FontVariations that affect how a variable font is rendered.

  • fontWeight FontWeight?
    The typeface thickness to use when painting the text (e.g., bold).

  • foreground Paint?
    The paint drawn as a foreground for the text.

  • hashCode int
    The hash code for this object.

  • height double?
    The height of this text span, as a multiple of the font size.

  • inherit bool
    Whether null values in this TextStyle can be replaced with their value in another TextStyle using merge.

  • leadingDistribution TextLeadingDistribution?
    How the vertical space added by the height multiplier should be distributed over and under the text.

  • letterSpacing double?
    The amount of space (in logical pixels) to add between each letter. A negative value can be used to bring the letters closer.

  • locale Locale?
    The locale used to select region-specific glyphs.

  • overflow TextOverflow?
    How visual text overflow should be handled.

  • runtimeType Type
    A representation of the runtime type of the object.

  • shadows List<Shadow>?
    A list of Shadows that will be painted underneath the text.

  • textBaseline TextBaseline?
    The common baseline that should be aligned between this text span and its parent text span, or, for the root text spans, with the line box.

  • wordSpacing double?
    The amount of space (in logical pixels) to add at each sequence of white-space (i.e., between each word). A negative value can be used to bring the words closer.

Here, we will change style to italic, bold, and we will change size as well.

    import 'package:flutter/material.dart'; 
    
    void main(){        
        runApp(MaterialApp(     
            home: Home(),
        ));
    }   
    
    class Home extends StatelessWidget{      
        @override
        Widget build(BuildContext context)
        {           
            return Scaffold(
                appBar: AppBar(
                    title: const Text('Page Title'),
                    centerTitle: true,
                    backgroundColor: Colors.blue[500],
                ),          
                body: Center(               
                    child: Text('Hello!',        
                        // we add a style parameter which is a TextStyle widget
                        style: TextStyle(
                            // choose a color for the TextStyle widget
                            color: Colors.red[800],
                            // a style
                            fontStyle: FontStyle.italic,
                            // a size
                            fontSize: 24,
                            // a boldness
                            fontWeight: FontWeight.bold,
                        ),
                    ),
                ),
            );
        }
    }

App Screen

1.6 Changing the Font

If a font other than the default font is to be used, it must be supplied with the app.

  • We first need to obtain the font by downloading it (or creating it for the enthusiastic).

  • We need to create a folder in the IDE for the font, and then drag and drop the font file from the file manager to the created folder in the IDE.

  • Then, we need to modify the pubspec.yaml by adding the following information at the bottom. The file pubspec.yaml is very sensitive about spaces, so always indent by exactly two spaces.

            flutter:
              uses-material-design: true
              # This is where I am adding the font
              fonts:
              # The name I am choosing for this font is NormandyBeach
                - family: NormandyBeach
                fonts:
                  # This is the path to the font in the project
                  - asset: lib/assets/fonts/NormandyBeach3DItalic.otf

After that, we can use the new font as follows.

    import 'package:flutter/material.dart'; 
    
    void main(){        
        runApp(MaterialApp(     
            home: Home(),
        ));
    }   
    
    class Home extends StatelessWidget{      
        @override
        Widget build(BuildContext context)
        {           
            return Scaffold(
                appBar: AppBar(
                    title: const Text('Page Title'),
                    centerTitle: true,
                    backgroundColor: Colors.blue[500],
                ),          
                body: Center(               
                    child: Text('Hello!',                               
                        style: TextStyle(                           
                            color: Colors.red[800],
                            fontStyle: FontStyle.italic,
                            fontSize: 24,
                            fontWeight: FontWeight.bold,
                            // a font family
                            fontFamily: 'NormandyBeach',
                        ),
                    ),
                ),
            );
        }
    }

App Screen

Last modified: Sunday, 18 January 2026, 5:29 AM