Responsive Typografie und Theming von Komponenten
Skalieren Sie Text und passen Sie Komponententhemes für ein konsistentes Branding auf verschiedenen Geräten an.
Responsive Typografie und Theming von Komponenten ist eine kostenlose Flutter Mobile Development-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Flutter Mobile Development-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Flutter Mobile Development-Kurs umfasst insgesamt 4 Lektionen.
Teile dieser Lektion wurden noch nicht übersetzt und werden auf Englisch angezeigt.
Why Typography Scales
A design system keeps your app's look consistent across phones, foldables, and tablets. Two pillars hold it together: typography (how text looks at every size) and component theming (how buttons, cards, and inputs are styled once and reused everywhere).
In Material 3, both live inside ThemeData. Instead of styling each widget by hand, you define the rules centrally and let widgets inherit them. This lesson shows how to scale text responsively and customize component themes for consistent cross-device branding.
- TextTheme carries the type scale (display, headline, title, body, label).
- Component themes (e.g.
ElevatedButtonThemeData) shape each widget family.
The Material 3 Type Scale
Material 3 defines a type scale of 15 named styles grouped into 5 roles. Each role has Large, Medium, and Small variants:
displayLarge/Medium/Small— big, expressive hero text.headlineLarge/Medium/Small— section headers.titleLarge/Medium/Small— list and dialog titles.bodyLarge/Medium/Small— paragraphs and main content.labelLarge/Medium/Small— buttons, captions, chips.
You read these from context anywhere in your widget tree, so a heading always matches the same scale no matter where it appears.
Widget build(BuildContext context) {
final textTheme = Theme.of(context).textTheme;
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Welcome', style: textTheme.displaySmall),
Text('Your daily summary', style: textTheme.titleMedium),
Text('Here is what happened today.', style: textTheme.bodyMedium),
],
);
}Customizing the TextTheme
To brand your typography, override the textTheme on ThemeData. A clean approach is to start from a base text theme and copyWith only the styles you want to change. This keeps the rest of the Material defaults intact.
Notice how each style is a TextStyle with explicit fontSize, fontWeight, and letterSpacing. Defining them in one place guarantees consistency across every screen.
final ThemeData appTheme = ThemeData(
useMaterial3: true,
textTheme: const TextTheme(
displaySmall: TextStyle(
fontSize: 36,
fontWeight: FontWeight.w700,
letterSpacing: -0.5,
),
titleMedium: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
),
bodyMedium: TextStyle(
fontSize: 14,
height: 1.4,
),
),
);Responsive Sizing with MediaQuery
Hard-coded font sizes look great on one device but cramped or oversized on another. Use MediaQuery to read the screen width and pick a scale factor. A common pattern: clamp a base size between a minimum and a maximum so text never gets absurdly small or large.
Here we compute a responsive headline size from the available width, then apply it on top of the theme's style with copyWith.
Widget build(BuildContext context) {
final width = MediaQuery.of(context).size.width;
// Scale headline between 24 and 40 based on width.
final headlineSize = (width / 14).clamp(24.0, 40.0);
final base = Theme.of(context).textTheme.headlineMedium;
return Text(
'Cross-device branding',
style: base?.copyWith(fontSize: headlineSize),
);
}Respecting the User's Text Scale
Accessibility matters: users can enlarge system text. In modern Flutter, read this via MediaQuery.textScalerOf(context), which returns a TextScaler. Avoid disabling it outright; instead clamp it so very large settings don't break your layout while still honoring the user's preference.
Wrap a subtree in MediaQuery with a clamped scaler to bound the growth.
Widget build(BuildContext context) {
final scaler = MediaQuery.textScalerOf(context)
.clamp(minScaleFactor: 1.0, maxScaleFactor: 1.6);
return MediaQuery(
data: MediaQuery.of(context).copyWith(textScaler: scaler),
child: const Text('Readable yet bounded'),
);
}A Pure-Dart Responsive Helper
The scaling logic itself is plain Dart and easy to unit-test in isolation, no Flutter needed. Below is a small function that maps a screen width to a font size with a linear ramp between two breakpoints, then clamps the result. Testing this pure logic separately keeps your widgets thin.
double responsiveFontSize(
double width, {
double minWidth = 320,
double maxWidth = 840,
double minSize = 14,
double maxSize = 22,
}) {
if (width <= minWidth) return minSize;
if (width >= maxWidth) return maxSize;
final t = (width - minWidth) / (maxWidth - minWidth);
return minSize + t * (maxSize - minSize);
}
void main() {
print(responsiveFontSize(300)); // 14.0 (clamped)
print(responsiveFontSize(580)); // ~17.0
print(responsiveFontSize(900)); // 22.0 (clamped)
}Introducing Component Themes
Beyond text, Material 3 lets you theme entire widget families centrally. Each has a dedicated *ThemeData slot on ThemeData:
elevatedButtonTheme,filledButtonTheme,textButtonThemecardTheme,chipTheme,appBarThemeinputDecorationThemefor text fields
Set them once and every matching widget inherits the styling. This is the heart of a design system: change the brand in one file, see it everywhere.
Theming Elevated Buttons
Use ElevatedButtonThemeData with a ButtonStyle to standardize padding, shape, and text style for every ElevatedButton in the app. Tying the button's label style back to labelLarge keeps it aligned with your type scale.
Because the theme supplies these defaults, individual buttons stay clean: ElevatedButton(onPressed: ..., child: Text('Save')) with no inline styling.
final elevatedButtonTheme = ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 14),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
textStyle: const TextStyle(
fontSize: 15,
fontWeight: FontWeight.w600,
),
),
);Theming Cards and Inputs
Cards and text fields are everywhere in mobile UIs, so theming them pays off fast. CardThemeData controls elevation, shape, and margin; InputDecorationTheme standardizes borders, fills, and label behavior for every TextField.
With these in place, a form looks consistent across the app without repeating decoration code on each field.
final cardTheme = CardThemeData(
elevation: 1,
margin: const EdgeInsets.all(8),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16),
),
);
final inputDecorationTheme = InputDecorationTheme(
filled: true,
contentPadding: const EdgeInsets.all(16),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide.none,
),
);Assembling the Full ThemeData
Now combine typography and component themes into a single ThemeData. Pairing it with a ColorScheme.fromSeed gives you a coherent Material 3 palette. Pass this theme to MaterialApp(theme: ...) and the whole app picks it up.
This one object is your design system's source of truth: brand colors, type scale, and component styling, all together.
ThemeData buildBrandTheme() {
return ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xFF6750A4)),
textTheme: const TextTheme(
titleMedium: TextStyle(fontSize: 16, fontWeight: FontWeight.w600),
bodyMedium: TextStyle(fontSize: 14, height: 1.4),
),
elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
),
cardTheme: CardThemeData(
elevation: 1,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16),
),
),
);
}Reading the Theme in Widgets
Once the theme is set, widgets should pull styling from it rather than hard-coding values. Use Theme.of(context) to access the textTheme, colorScheme, and any component theme.
This makes your widgets theme-agnostic: switch to a dark theme or rebrand, and they update automatically because they never assumed a specific color or size.
Widget build(BuildContext context) {
final theme = Theme.of(context);
return Card(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Account', style: theme.textTheme.titleMedium),
const SizedBox(height: 8),
Text(
'Manage your profile and settings.',
style: theme.textTheme.bodyMedium?.copyWith(
color: theme.colorScheme.onSurfaceVariant,
),
),
],
),
),
);
}Quick Check
You want every TextField in your app to share the same rounded, filled border without repeating decoration code on each field. Which approach fits a Material 3 design system best?
Recap
You built the typography and component foundation of a Material 3 design system:
- Type scale: the 15 named styles (display, headline, title, body, label) read via
Theme.of(context).textTheme. - Custom TextTheme: override fonts and sizes centrally with
copyWith. - Responsive sizing: derive sizes from
MediaQuerywidth andclampthem, and respect (but bound) the user'stextScalerfor accessibility. - Component themes:
ElevatedButtonThemeData,CardThemeData, andInputDecorationThemestyle entire widget families once. - Single source of truth: assemble everything into one
ThemeDatawithColorScheme.fromSeed, then read it in theme-agnostic widgets.
The result is consistent cross-device branding that adapts to screen size and user preferences without per-widget styling.
Häufig gestellte Fragen
Ist die Lektion „Responsive Typografie und Theming von Komponenten“ kostenlos?
Ja — der vollständige Text von „Responsive Typografie und Theming von Komponenten“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Flutter Mobile Development-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Flutter Mobile Development-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Responsive Typografie und Theming von Komponenten“?
Skalieren Sie Text und passen Sie Komponententhemes für ein konsistentes Branding auf verschiedenen Geräten an. Du übst Flutter Mobile Development mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Flutter Mobile Development zu starten?
Keine Vorkenntnisse erforderlich. Flutter Mobile Development auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Responsive Typografie und Theming von Komponenten“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Flutter Mobile Development-Lektion Code schreiben und ausführen?
Ja. Jede Flutter Mobile Development-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Material-3-Farbschemata und Seed-Farben
- Dynamische Farben und adaptive helle/dunkle Themes
- Eigene ThemeExtension für Brand-Tokens
- Responsive Typografie und Theming von Komponenten