Styled Text
Einleitung
StyledText ist ein Widget zur Anzeige von Rich Text mit gemischten Stilen, Tipp-Callbacks und Pointer-Events. Es wird als RichText-Widget mit mehreren TextSpan-Kindern gerendert und bietet Ihnen feinkoernige Kontrolle ueber jedes Textsegment.
StyledText unterstuetzt zwei Modi:
- Children-Modus -- uebergeben Sie eine Liste von
Text-Widgets, jedes mit eigenem Stil - Template-Modus -- verwenden Sie
{{Platzhalter}}-Syntax in einem String und ordnen Sie Platzhaltern Stile und Aktionen zu
Grundlegende Verwendung
// Children mode - list of Text widgets
StyledText(
children: [
Text("Hello ", style: TextStyle(color: Colors.black)),
Text("World", style: TextStyle(color: Colors.blue, fontWeight: FontWeight.bold)),
],
)
// Template mode - placeholder syntax
StyledText.template(
"Welcome to {{Nylo}}!",
styles: {
"Nylo": TextStyle(fontWeight: FontWeight.bold, color: Colors.blue),
},
)
Children-Modus
Uebergeben Sie eine Liste von Text-Widgets, um gestylten Text zusammenzusetzen:
StyledText(
style: TextStyle(fontSize: 16, color: Colors.black),
children: [
Text("Your order "),
Text("#1234", style: TextStyle(fontWeight: FontWeight.bold)),
Text(" has been "),
Text("confirmed", style: TextStyle(color: Colors.green, fontWeight: FontWeight.bold)),
Text("."),
],
)
Der Basis-style wird auf jedes Kind angewendet, das keinen eigenen Stil hat.
Pointer-Events
Erkennen Sie, wenn der Pointer ein Textsegment betritt oder verlaesst:
StyledText(
onEnter: (Text text, PointerEnterEvent event) {
print("Hovering over: ${text.data}");
},
onExit: (Text text, PointerExitEvent event) {
print("Left: ${text.data}");
},
children: [
Text("Hover me", style: TextStyle(color: Colors.blue)),
Text(" or "),
Text("me", style: TextStyle(color: Colors.red)),
],
)
Template-Modus
Verwenden Sie StyledText.template() mit der {{Platzhalter}}-Syntax:
StyledText.template(
"By continuing, you agree to our {{Terms of Service}} and {{Privacy Policy}}.",
style: TextStyle(color: Colors.grey),
styles: {
"Terms of Service": TextStyle(color: Colors.blue, decoration: TextDecoration.underline),
"Privacy Policy": TextStyle(color: Colors.blue, decoration: TextDecoration.underline),
},
onTap: {
"Terms of Service": () => routeTo("/terms"),
"Privacy Policy": () => routeTo("/privacy"),
},
)
Der Text zwischen {{ }} ist sowohl der Anzeigetext als auch der Schluessel, der zum Nachschlagen von Stilen und Tipp-Callbacks verwendet wird.
Platzhalter stylen
Ordnen Sie Platzhalternamen TextStyle-Objekten zu:
StyledText.template(
"Framework Version: @{{$version}}",
style: textTheme.bodyMedium,
styles: {
version: TextStyle(fontWeight: FontWeight.bold),
},
)
Tipp-Callbacks
Ordnen Sie Platzhalternamen Tipp-Handlern zu:
StyledText.template(
"{{Sign up}} or {{Log in}} to continue.",
onTap: {
"Sign up": () => routeTo(SignUpPage.path),
"Log in": () => routeTo(LoginPage.path),
},
styles: {
"Sign up": TextStyle(color: Colors.blue, fontWeight: FontWeight.bold),
"Log in": TextStyle(color: Colors.blue, fontWeight: FontWeight.bold),
},
)
Pipe-getrennte Schluessel
Wenden Sie denselben Stil oder Callback auf mehrere Platzhalter an, indem Sie durch Pipe | getrennte Schluessel verwenden:
StyledText.template(
"Available in {{English}}, {{French}}, and {{German}}.",
styles: {
"English|French|German": TextStyle(
fontWeight: FontWeight.bold,
color: Colors.blue,
),
},
onTap: {
"English|French|German": () => showLanguagePicker(),
},
)
Dies ordnet allen drei Platzhaltern denselben Stil und Callback zu.
Parameter
StyledText (Children-Modus)
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
children |
List<Text> |
erforderlich | Liste von Text-Widgets |
style |
TextStyle? |
null | Basisstil fuer alle Kinder |
onEnter |
Function(Text, PointerEnterEvent)? |
null | Pointer-Enter-Callback |
onExit |
Function(Text, PointerExitEvent)? |
null | Pointer-Exit-Callback |
spellOut |
bool? |
null | Text Zeichen fuer Zeichen buchstabieren |
softWrap |
bool |
true |
Weichen Zeilenumbruch aktivieren |
textAlign |
TextAlign |
TextAlign.start |
Textausrichtung |
textDirection |
TextDirection? |
null | Textrichtung |
maxLines |
int? |
null | Maximale Zeilenanzahl |
overflow |
TextOverflow |
TextOverflow.clip |
Ueberlaufverhalten |
locale |
Locale? |
null | Text-Locale |
strutStyle |
StrutStyle? |
null | Strut-Stil |
textScaler |
TextScaler? |
null | Textskalierung |
selectionColor |
Color? |
null | Hervorhebungsfarbe bei Auswahl |
StyledText.template (Template-Modus)
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
text |
String |
erforderlich | Template-Text mit {{Platzhalter}}-Syntax |
styles |
Map<String, TextStyle>? |
null | Zuordnung von Platzhalternamen zu Stilen |
onTap |
Map<String, VoidCallback>? |
null | Zuordnung von Platzhalternamen zu Tipp-Callbacks |
style |
TextStyle? |
null | Basisstil fuer Nicht-Platzhalter-Text |
Alle anderen Parameter (softWrap, textAlign, maxLines usw.) sind identisch mit dem Children-Konstruktor.
Text-Erweiterungen
Nylo Website erweitert Flutters Text-Widget um Typografie- und Hilfsmethoden.
Typografie-Stile
Wenden Sie Material-Design-Typografiestile auf jedes Text-Widget an:
Text("Hello").displayLarge()
Text("Hello").displayMedium()
Text("Hello").displaySmall()
Text("Hello").headingLarge()
Text("Hello").headingMedium()
Text("Hello").headingSmall()
Text("Hello").titleLarge()
Text("Hello").titleMedium()
Text("Hello").titleSmall()
Text("Hello").bodyLarge()
Text("Hello").bodyMedium()
Text("Hello").bodySmall()
Text("Hello").labelLarge()
Text("Hello").labelMedium()
Text("Hello").labelSmall()
Jede akzeptiert optionale Ueberschreibungen:
Text("Welcome").headingLarge(
color: Colors.blue,
fontWeight: FontWeight.w700,
letterSpacing: 1.2,
)
Verfuegbare Ueberschreibungen (identisch fuer alle Typografie-Methoden):
| Parameter | Typ | Beschreibung |
|---|---|---|
color |
Color? |
Textfarbe |
fontSize |
double? |
Schriftgroesse |
fontWeight |
FontWeight? |
Schriftstaerke |
fontStyle |
FontStyle? |
Kursiv/Normal |
letterSpacing |
double? |
Zeichenabstand |
wordSpacing |
double? |
Wortabstand |
height |
double? |
Zeilenhoehe |
decoration |
TextDecoration? |
Textdekoration |
decorationColor |
Color? |
Dekorationsfarbe |
decorationStyle |
TextDecorationStyle? |
Dekorationsstil |
decorationThickness |
double? |
Dekorationsstaerke |
fontFamily |
String? |
Schriftfamilie |
shadows |
List<Shadow>? |
Textschatten |
overflow |
TextOverflow? |
Ueberlaufverhalten |
Hilfsmethoden
// Font weight
Text("Bold text").fontWeightBold()
Text("Light text").fontWeightLight()
// Alignment
Text("Left aligned").alignLeft()
Text("Center aligned").alignCenter()
Text("Right aligned").alignRight()
// Max lines
Text("Long text...").setMaxLines(2)
// Font family
Text("Custom font").setFontFamily("Roboto")
// Font size
Text("Big text").setFontSize(24)
// Custom style
Text("Styled").setStyle(TextStyle(color: Colors.red))
// Padding
Text("Padded").paddingOnly(left: 8, top: 4, right: 8, bottom: 4)
// Copy with modifications
Text("Original").copyWith(
textAlign: TextAlign.center,
maxLines: 2,
style: TextStyle(fontSize: 18),
)
Beispiele
AGB- und Datenschutz-Link
StyledText.template(
"By signing up, you agree to our {{Terms}} and {{Privacy Policy}}.",
style: TextStyle(color: Colors.grey.shade600, fontSize: 14),
styles: {
"Terms|Privacy Policy": TextStyle(
color: Colors.blue,
decoration: TextDecoration.underline,
),
},
onTap: {
"Terms": () => routeTo("/terms"),
"Privacy Policy": () => routeTo("/privacy"),
},
)
Versionsanzeige
StyledText.template(
"Framework Version: {{$nyloVersion}}",
style: textTheme.bodyMedium!.copyWith(
color: NyColor(
light: Colors.grey.shade800,
dark: Colors.grey.shade200,
).toColor(context),
),
styles: {
nyloVersion: TextStyle(fontWeight: FontWeight.bold),
},
)
Absatz mit gemischten Stilen
StyledText(
style: TextStyle(fontSize: 16, height: 1.5),
children: [
Text("Flutter "),
Text("makes it easy", style: TextStyle(fontWeight: FontWeight.bold)),
Text(" to build beautiful apps. With "),
Text("Nylo", style: TextStyle(color: Colors.blue, fontWeight: FontWeight.bold)),
Text(", it's even faster."),
],
)
Typografie-Verkettung
Text("Welcome Back")
.headingLarge(color: Colors.black)
.alignCenter()