Text is one of the most basic and important elements in any application. In Flutter, text display and style control are very flexible, capable of meeting various complex UI requirements. This lesson will detailedly introduce core components and style control methods related to text in Flutter, helping you master various text display techniques.
I. Detailed Explanation of Text Widget Properties
The Text widget is the basic component for displaying text in Flutter, providing rich properties to control the appearance and behavior of text.
Basic Properties
Text(
"Hello Flutter", // Text content to display
style: TextStyle(...), // Text style
textAlign: TextAlign.center, // Text alignment
textDirection: TextDirection.ltr, // Text direction (left-to-right/right-to-left)
softWrap: true, // Whether to wrap text automatically
overflow: TextOverflow.ellipsis, // Text overflow handling
maxLines: 2, // Maximum number of lines
textScaleFactor: 1.0, // Text scaling factor
semanticsLabel: "Hello Flutter", // Semantic label for accessibility
)
Detailed Explanation of Common Properties
- textAlign - Text alignment
// Optional values
TextAlign.left // Left alignment
TextAlign.right // Right alignment
TextAlign.center // Center alignment
TextAlign.justify // Justified alignment
TextAlign.start // Alignment at start of text direction
TextAlign.end // Alignment at end of text direction
2 . overflow - Text overflow handling
// Common values
TextOverflow.clip // Clip overflowing content
TextOverflow.fade // Fade out overflowing content
TextOverflow.ellipsis // Show ellipsis (...) for overflow
TextOverflow.visible // Allow content to overflow
3 . softWrap - Automatic line wrapping control
- true (default): Text wraps when exceeding container width
- false: Text doesn't wrap, may cause overflow
4 . maxLines - Maximum line limit
- Set to null for no limit (default)
- Used with overflow property to control handling of text exceeding line limit
II. TextStyle for Style Control
TextStyle is the core class for controlling text appearance, with almost all text-related styles defined through it.
Common Style Properties
TextStyle(
fontSize: 16.0, // Font size, default 14
color: Colors.black87, // Text color
fontWeight: FontWeight.w400, // Font weight
fontStyle: FontStyle.normal, // Font style (normal/italic)
letterSpacing: 0.5, // Letter spacing
wordSpacing: 2.0, // Word spacing
height: 1.5, // Line height, multiplier of font size
backgroundColor: Colors.yellow, // Background color
decoration: TextDecoration.none, // Text decoration (underline, etc.)
decorationColor: Colors.red, // Decoration line color
decorationStyle: TextDecorationStyle.solid, // Decoration line style
fontFamily: "Roboto", // Font family
shadows: [ // Text shadows
Shadow(
color: Colors.grey,
offset: Offset(1, 1),
blurRadius: 2,
)
],
)
Font Weight (fontWeight)
FontWeight defines the thickness of text, with common values including:
- FontWeight.w100 - Thinest
- FontWeight.w300 - Light
- FontWeight.w400 - Normal (default)
- FontWeight.w500 - Medium
- FontWeight.w700 - Bold
- FontWeight.w900 - Black
- Shortcut: FontWeight.bold is equivalent to FontWeight.w700
Text Decoration (decoration)
You can add various decorative lines to text:
TextDecoration.none // No decoration
TextDecoration.underline // Underline
TextDecoration.overline // Overline
TextDecoration.lineThrough // Line through
Decoration line styles (decorationStyle):
TextDecorationStyle.solid // Solid line (default)
TextDecorationStyle.dashed // Dashed line
TextDecorationStyle.dotted // Dotted line
TextDecorationStyle.double // Double line
TextDecorationStyle.wavy // Wavy line
III. DefaultTextStyle for Style Reuse
In actual development, we often need to maintain consistent text styles across different parts of an application. DefaultTextStyle allows us to set default text styles for an entire subtree of widgets, enabling style reuse.
Basic Usage
DefaultTextStyle(
// Set default text style
style: const TextStyle(
color: Colors.grey,
fontSize: 14,
fontFamily: 'sans-serif',
),
// Text alignment
textAlign: TextAlign.start,
// Maximum lines
maxLines: 2,
// Overflow handling
overflow: TextOverflow.ellipsis,
// Child widget tree
child: Column(
children: const [
Text("This text uses the default style"),
Text("This text also uses the default style"),
// Can override default style
Text(
"This text uses a custom style",
style: TextStyle(
color: Colors.blue,
fontSize: 16,
),
),
],
),
)
Practical Application Scenarios
DefaultTextStyle is particularly suitable for components containing multiple text elements such as lists and cards. It allows setting base styles uniformly while enabling individual styling where special styles are needed, ensuring consistency while maintaining flexibility.
IV. Rich Text with RichText and TextSpan
When needing multiple different styles within a single text passage, the Text widget is insufficient. We need to use RichText with TextSpan to achieve rich text effects.
Basic Usage of RichText
RichText(
text: TextSpan(
// Base style, child TextSpans inherit this
style: const TextStyle(
color: Colors.black87,
fontSize: 16,
),
children: [
const TextSpan(text: "This is a section of"),
TextSpan(
text: "red bold text",
style: const TextStyle(
color: Colors.red,
fontWeight: FontWeight.bold,
),
// Can add tap event
recognizer: TapGestureRecognizer()
..onTap = () {
print("Tapped red bold text");
},
),
const TextSpan(text: "where this part"),
TextSpan(
text: "has an underline",
style: const TextStyle(
decoration: TextDecoration.underline,
color: Colors.blue,
),
),
const TextSpan(text: "."),
],
),
// Text alignment
textAlign: TextAlign.center,
)
Nested TextSpan Usage
TextSpan can be nested for more complex text structures:
RichText(
text: TextSpan(
style: const TextStyle(color: Colors.black, fontSize: 16),
children: [
const TextSpan(text: "User Agreement:\n\n"),
TextSpan(
children: [
const TextSpan(text: "1. "),
const TextSpan(
text: "This agreement",
style: TextStyle(fontWeight: FontWeight.bold),
),
const TextSpan(text: "applies to all users.\n"),
],
),
TextSpan(
children: [
const TextSpan(text: "2. Users must comply with the"),
TextSpan(
text: "terms of service",
style: const TextStyle(color: Colors.blue),
recognizer: TapGestureRecognizer()
..onTap = () {
// Navigate to terms of service page
},
),
const TextSpan(text: "and related regulations."),
],
),
],
),
)
Practical Application Scenarios
Rich text is commonly used for:
- Text paragraphs with different styles (e.g., agreement text)
- Text with highlighted sections (e.g., search results)
- Clickable text links (e.g., privacy policy links)
- Mixed icons and text (via WidgetSpan)
WidgetSpan for Mixing Widgets and Text
WidgetSpan allows inserting other widgets within text for text-image mixing:
RichText(
text: TextSpan(
style: const TextStyle(color: Colors.black, fontSize: 16),
children: [
const TextSpan(text: "Your points: "),
WidgetSpan(
child: Icon(Icons.star, color: Colors.yellow[700], size: 18),
),
const TextSpan(
text: " 1250",
style: TextStyle(color: Colors.orange, fontWeight: FontWeight.bold),
),
],
),
)
V. Font Import and Custom Fonts
Flutter supports using custom fonts to give your app a unique text style. Using custom fonts requires the following steps:
Step 1: Prepare Font Files
- Create a fonts folder in the project root directory (if it doesn't exist)
- Place font files (usually .ttf or .otf format) in this folder
- It's recommended to create subfolders for different weights/styles to keep the structure clear:
fonts/
OpenSans/
OpenSans-Regular.ttf
OpenSans-Bold.ttf
OpenSans-Italic.ttf
Step 2: Configure Fonts in pubspec.yaml
Open the pubspec.yaml file in the project root directory and add font configurations:
flutter:
fonts:
- family: OpenSans # Font family name, used in code
fonts:
- asset: fonts/OpenSans/OpenSans-Regular.ttf # Regular font
- asset: fonts/OpenSans/OpenSans-Bold.ttf
weight: 700 # Bold weight
- asset: fonts/OpenSans/OpenSans-Italic.ttf
style: italic # Italic style
Configuration explanation:
- family: Font family name, used in TextStyle's fontFamily property
- asset: Path to font file relative to project root
- weight: Optional, specifies font weight (100-900)
- style: Optional, specifies style (normal/italic)
After configuration, run flutter pub get to make the configuration effective.
Step 3: Use Custom Fonts
Reference custom fonts in TextStyle through the fontFamily property:
Text(
"Text using custom font",
style: TextStyle(
fontFamily: "OpenSans", // Matches family in pubspec.yaml
fontSize: 20,
),
)
// Using bold variant
Text(
"Bold text with custom font",
style: TextStyle(
fontFamily: "OpenSans",
fontWeight: FontWeight.w700, // Matches weight in configuration
fontSize: 20,
),
)
// Using italic variant
Text(
"Italic text with custom font",
style: TextStyle(
fontFamily: "OpenSans",
fontStyle: FontStyle.italic, // Matches style in configuration
fontSize: 20,
),
)
Step 4: Set Global Default Font
To use a custom font throughout the entire application, configure it through ThemeData:
MaterialApp(
title: 'Custom Font Example',
theme: ThemeData(
// Set global font
fontFamily: 'OpenSans',
// Other theme configurations...
),
home: const MyHomePage(),
)
VI. Practical Text Techniques
1. Responsive Font Sizes
Automatically adjust font size based on different screen sizes:
// Use MediaQuery to get screen information
Text(
"Responsive font",
style: TextStyle(
fontSize: MediaQuery.of(context).size.width * 0.05, // 5% of screen width
),
)
// Use FittedBox to automatically fit container
Container(
width: 100,
child: FittedBox(
fit: BoxFit.scaleDown,
child: Text("This text will automatically shrink to fit container width"),
),
)
2. Text Spacing and Line Height Adjustment
Text(
"Example text with adjusted line height and letter spacing. "
"This is the second line to demonstrate line height effect.",
style: TextStyle(
fontSize: 16,
letterSpacing: 1.2, // Letter spacing
wordSpacing: 3.0, // Word spacing
height: 1.8, // Line height, multiplier of font size
),
textAlign: TextAlign.justify,
)
3. Text Selection and Copying
By default, text in the Text widget is not selectable. To enable text selection, use SelectableText:
SelectableText(
"This text can be selected and copied. "
"Long press to show context menu for copy operations.",
style: const TextStyle(fontSize: 16),
cursorColor: Colors.blue, // Cursor color
selectionColor: Colors.blue.withOpacity(0.2), // Selected text background color
onSelectionChanged: (selection, cause) {
// Callback when selection state changes
print("Selected text: ${selection.textInside('This text can be selected and copied. Long press to show context menu for copy operations.')}");
},
)
Top comments (0)