Themes & Styling
Einleitung
Sie koennen die UI-Stile Ihrer Anwendung mithilfe von Themes verwalten. Themes ermoeglichen es uns, z.B. die Schriftgroesse von Texten, das Erscheinungsbild von Buttons und das allgemeine Aussehen unserer Anwendung zu aendern.
Wenn Sie neu bei Themes sind, helfen Ihnen die Beispiele auf der Flutter-Website beim Einstieg hier.
Standardmaessig enthaelt Nylo Website vorkonfigurierte Themes fuer Light mode und Dark mode.
Das Theme wird auch aktualisiert, wenn das Geraet in den 'light/dark'-Modus wechselt.
Helles & Dunkles Theme
- Helles Theme -
lib/resources/themes/light_theme.dart - Dunkles Theme -
lib/resources/themes/dark_theme.dart
In diesen Dateien finden Sie die vordefinierte ThemeData und ThemeStyle.
Ein Theme erstellen
Wenn Sie mehrere Themes fuer Ihre App haben moechten, bieten wir Ihnen einen einfachen Weg dafuer. Wenn Sie neu bei Themes sind, folgen Sie der Anleitung.
Fuehren Sie zuerst den folgenden Befehl im Terminal aus
metro make:theme bright_theme
Hinweis: Ersetzen Sie bright_theme durch den Namen Ihres neuen Themes.
Dies erstellt ein neues Theme in Ihrem Verzeichnis /resources/themes/ sowie eine Theme-Farben-Datei in /resources/themes/styles/.
// App Themes
final List<BaseThemeConfig<ColorStyles>> appThemes = [
BaseThemeConfig<ColorStyles>(
id: getEnv('LIGHT_THEME_ID'),
description: "Light theme",
theme: lightTheme,
colors: LightThemeColors(),
),
BaseThemeConfig<ColorStyles>(
id: getEnv('DARK_THEME_ID'),
description: "Dark theme",
theme: darkTheme,
colors: DarkThemeColors(),
),
BaseThemeConfig<ColorStyles>( // new theme automatically added
id: 'Bright Theme',
description: "Bright Theme",
theme: brightTheme,
colors: BrightThemeColors(),
),
];
Sie koennen die Farben fuer Ihr neues Theme in der Datei /resources/themes/styles/bright_theme_colors.dart aendern.
Theme-Farben
Um die Theme-Farben in Ihrem Projekt zu verwalten, schauen Sie sich das Verzeichnis lib/resources/themes/styles an.
Dieses Verzeichnis enthaelt die Stilfarben fuer light_theme_colors.dart und dark_theme_colors.dart.
In dieser Datei sollten Sie etwas Aehnliches wie das Folgende haben.
// e.g Light Theme colors
class LightThemeColors implements ColorStyles {
// general
@override
Color get background => const Color(0xFFFFFFFF);
@override
Color get content => const Color(0xFF000000);
@override
Color get primaryAccent => const Color(0xFF0045a0);
@override
Color get surfaceBackground => Colors.white;
@override
Color get surfaceContent => Colors.black;
// app bar
@override
Color get appBarBackground => Colors.blue;
@override
Color get appBarPrimaryContent => Colors.white;
// buttons
@override
Color get buttonBackground => Colors.blue;
@override
Color get buttonContent => Colors.white;
@override
Color get buttonSecondaryBackground => const Color(0xff151925);
@override
Color get buttonSecondaryContent => Colors.white.withAlpha((255.0 * 0.9).round());
// bottom tab bar
@override
Color get bottomTabBarBackground => Colors.white;
// bottom tab bar - icons
@override
Color get bottomTabBarIconSelected => Colors.blue;
@override
Color get bottomTabBarIconUnselected => Colors.black54;
// bottom tab bar - label
@override
Color get bottomTabBarLabelUnselected => Colors.black45;
@override
Color get bottomTabBarLabelSelected => Colors.black;
// toast notification
@override
Color get toastNotificationBackground => Colors.white;
}
Farben in Widgets verwenden
import 'package:flutter_app/config/theme.dart';
...
// gets the light/dark background colour depending on the theme
ThemeColor.get(context).background
// e.g. of using the "ThemeColor" class
Text(
"Hello World",
style: TextStyle(
color: ThemeColor.get(context).content // Color - content
),
),
// or
Text(
"Hello World",
style: TextStyle(
color: ThemeConfig.light().colors.content // Light theme colors - primary content
),
),
Basis-Stile
Basis-Stile ermoeglichen es Ihnen, verschiedene Widget-Farben von einer Stelle in Ihrem Code aus anzupassen.
Nylo Website wird mit vorkonfigurierten Basis-Stilen fuer Ihr Projekt in lib/resources/themes/styles/color_styles.dart geliefert.
Diese Stile bieten ein Interface fuer Ihre Theme-Farben in light_theme_colors.dart und dart_theme_colors.dart.
Datei lib/resources/themes/styles/color_styles.dart
abstract class ColorStyles {
// general
@override
Color get background;
@override
Color get content;
@override
Color get primaryAccent;
@override
Color get surfaceBackground;
@override
Color get surfaceContent;
// app bar
@override
Color get appBarBackground;
@override
Color get appBarPrimaryContent;
@override
Color get buttonBackground;
@override
Color get buttonContent;
@override
Color get buttonSecondaryBackground;
@override
Color get buttonSecondaryContent;
// bottom tab bar
@override
Color get bottomTabBarBackground;
// bottom tab bar - icons
@override
Color get bottomTabBarIconSelected;
@override
Color get bottomTabBarIconUnselected;
// bottom tab bar - label
@override
Color get bottomTabBarLabelUnselected;
@override
Color get bottomTabBarLabelSelected;
// toast notification
Color get toastNotificationBackground;
}
Sie koennen hier zusaetzliche Stile hinzufuegen und dann die Farben in Ihrem Theme implementieren.
Theme wechseln
Nylo Website unterstuetzt die Moeglichkeit, Themes zur Laufzeit zu wechseln.
Z.B. wenn Sie das Theme wechseln muessen, weil ein Benutzer auf einen Button tippt, um das "dunkle Theme" zu aktivieren.
Sie koennen dies wie folgt unterstuetzen:
import 'package:nylo_framework/theme/helper/ny_theme.dart';
...
TextButton(onPressed: () {
// set theme to use the "dark theme"
NyTheme.set(context, id: "dark_theme");
setState(() { });
}, child: Text("Dark Theme")
),
// or
TextButton(onPressed: () {
// set theme to use the "light theme"
NyTheme.set(context, id: "light_theme");
setState(() { });
}, child: Text("Light Theme")
),
Schriftarten
Das Aktualisieren Ihrer primaeren Schriftart in der gesamten App ist in Nylo Website einfach. Oeffnen Sie die Datei lib/config/design.dart und aktualisieren Sie das Folgende.
final TextStyle appThemeFont = GoogleFonts.lato();
Wir binden die GoogleFonts-Bibliothek im Repository ein, sodass Sie alle Schriftarten mit wenig Aufwand verwenden koennen. Um die Schriftart zu aendern, koennen Sie Folgendes tun:
// OLD
// final TextStyle appThemeFont = GoogleFonts.lato();
// NEW
final TextStyle appThemeFont = GoogleFonts.montserrat();
Schauen Sie sich die Schriftarten in der offiziellen Google Fonts-Bibliothek an, um mehr zu erfahren.
Muessen Sie eine benutzerdefinierte Schriftart verwenden? Schauen Sie sich diese Anleitung an - https://flutter.dev/docs/cookbook/design/fonts
Sobald Sie Ihre Schriftart hinzugefuegt haben, aendern Sie die Variable wie im folgenden Beispiel.
final TextStyle appThemeFont = TextStyle(fontFamily: "ZenTokyoZoo"); // ZenTokyoZoo used as an example for the custom font
Design
Die Datei config/design.dart wird zur Verwaltung der Design-Elemente Ihrer App verwendet.
Die Variable appFont enthaelt die Schriftart fuer Ihre App.
Die Variable logo wird zur Anzeige des Logos Ihrer App verwendet.
Sie koennen resources/widgets/logo_widget.dart aendern, um die Darstellung Ihres Logos anzupassen.
Die Variable loader wird zur Anzeige eines Laders verwendet. Nylo Website verwendet diese Variable in einigen Hilfsmethoden als Standard-Loader-Widget.
Sie koennen resources/widgets/loader_widget.dart aendern, um die Darstellung Ihres Laders anzupassen.
Text-Extensions
Hier sind die verfuegbaren Text-Extensions, die Sie in Nylo Website verwenden koennen.
| Regelname | Verwendung | Info |
|---|---|---|
| Display Large | displayLarge() | Wendet das displayLarge textTheme an |
| Display Medium | displayMedium() | Wendet das displayMedium textTheme an |
| Display Small | displaySmall() | Wendet das displaySmall textTheme an |
| Heading Large | headingLarge() | Wendet das headingLarge textTheme an |
| Heading Medium | headingMedium() | Wendet das headingMedium textTheme an |
| Heading Small | headingSmall() | Wendet das headingSmall textTheme an |
| Title Large | titleLarge() | Wendet das titleLarge textTheme an |
| Title Medium | titleMedium() | Wendet das titleMedium textTheme an |
| Title Small | titleSmall() | Wendet das titleSmall textTheme an |
| Body Large | bodyLarge() | Wendet das bodyLarge textTheme an |
| Body Medium | bodyMedium() | Wendet das bodyMedium textTheme an |
| Body Small | bodySmall() | Wendet das bodySmall textTheme an |
| Label Large | labelLarge() | Wendet das labelLarge textTheme an |
| Label Medium | labelMedium() | Wendet das labelMedium textTheme an |
| Label Small | labelSmall() | Wendet das labelSmall textTheme an |
| Font Weight Bold | fontWeightBold | Wendet fette Schriftstärke auf ein Text-Widget an |
| Font Weight Light | fontWeightLight | Wendet leichte Schriftstärke auf ein Text-Widget an |
| Set Color | setColor(context, (color) => colors.primaryAccent) | Setzt eine andere Textfarbe auf dem Text-Widget |
| Align Left | alignLeft | Richtet die Schrift links aus |
| Align Right | alignRight | Richtet die Schrift rechts aus |
| Align Center | alignCenter | Richtet die Schrift zentriert aus |
| Set Max Lines | setMaxLines(int maxLines) | Setzt die maximale Zeilenanzahl fuer das Text-Widget |
Display large
Text("Hello World").displayLarge()
Display medium
Text("Hello World").displayMedium()
Display small
Text("Hello World").displaySmall()
Heading large
Text("Hello World").headingLarge()
Heading medium
Text("Hello World").headingMedium()
Heading small
Text("Hello World").headingSmall()
Title large
Text("Hello World").titleLarge()
Title medium
Text("Hello World").titleMedium()
Title small
Text("Hello World").titleSmall()
Body large
Text("Hello World").bodyLarge()
Body medium
Text("Hello World").bodyMedium()
Body small
Text("Hello World").bodySmall()
Label large
Text("Hello World").labelLarge()
Label medium
Text("Hello World").labelMedium()
Label small
Text("Hello World").labelSmall()
Font weight bold
Text("Hello World").fontWeightBold()
Font weight light
Text("Hello World").fontWeightLight()
Set color
Text("Hello World").setColor(context, (color) => colors.content)
// Color from your colorStyles
Align left
Text("Hello World").alignLeft()
Align right
Text("Hello World").alignRight()
Align center
Text("Hello World").alignCenter()
Set max lines
Text("Hello World").setMaxLines(5)