Styled Text
Introduzione
StyledText e' un widget per visualizzare testo ricco con stili misti, callback al tap ed eventi del puntatore. Viene renderizzato come un widget RichText con piu' figli TextSpan, dandoti un controllo dettagliato su ogni segmento di testo.
StyledText supporta due modalita':
- Modalita' children -- passa una lista di widget
Text, ciascuno con il proprio stile - Modalita' template -- usa la sintassi
{{placeholder}}in una stringa e mappa i placeholder a stili e azioni
Utilizzo Base
// 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),
},
)
Modalita' Children
Passa una lista di widget Text per comporre testo stilizzato:
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("."),
],
)
Lo style di base viene applicato a qualsiasi figlio che non ha un proprio stile.
Eventi del Puntatore
Rileva quando il puntatore entra o esce da un segmento di testo:
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)),
],
)
Modalita' Template
Usa StyledText.template() con la sintassi {{placeholder}}:
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"),
},
)
Il testo tra {{ }} e' sia il testo visualizzato che la chiave usata per cercare stili e callback al tap.
Stilizzare i Placeholder
Mappa i nomi dei placeholder a oggetti TextStyle:
StyledText.template(
"Framework Version: @{{$version}}",
style: textTheme.bodyMedium,
styles: {
version: TextStyle(fontWeight: FontWeight.bold),
},
)
Callback al Tap
Mappa i nomi dei placeholder a gestori di tap:
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),
},
)
Chiavi Separate da Pipe
Applica lo stesso stile o callback a piu' placeholder usando chiavi separate dal carattere pipe |:
StyledText.template(
"Available in {{English}}, {{French}}, and {{German}}.",
styles: {
"English|French|German": TextStyle(
fontWeight: FontWeight.bold,
color: Colors.blue,
),
},
onTap: {
"English|French|German": () => showLanguagePicker(),
},
)
Questo mappa lo stesso stile e callback a tutti e tre i placeholder.
Parametri
StyledText (Modalita' Children)
| Parametro | Tipo | Predefinito | Descrizione |
|---|---|---|---|
children |
List<Text> |
obbligatorio | Lista di widget Text |
style |
TextStyle? |
null | Stile di base per tutti i figli |
onEnter |
Function(Text, PointerEnterEvent)? |
null | Callback entrata puntatore |
onExit |
Function(Text, PointerExitEvent)? |
null | Callback uscita puntatore |
spellOut |
bool? |
null | Compita il testo carattere per carattere |
softWrap |
bool |
true |
Abilita il soft wrapping |
textAlign |
TextAlign |
TextAlign.start |
Allineamento del testo |
textDirection |
TextDirection? |
null | Direzione del testo |
maxLines |
int? |
null | Numero massimo di righe |
overflow |
TextOverflow |
TextOverflow.clip |
Comportamento di overflow |
locale |
Locale? |
null | Locale del testo |
strutStyle |
StrutStyle? |
null | Stile strut |
textScaler |
TextScaler? |
null | Scalatore del testo |
selectionColor |
Color? |
null | Colore di evidenziazione della selezione |
StyledText.template (Modalita' Template)
| Parametro | Tipo | Predefinito | Descrizione |
|---|---|---|---|
text |
String |
obbligatorio | Testo template con sintassi {{placeholder}} |
styles |
Map<String, TextStyle>? |
null | Mappa dei nomi dei placeholder agli stili |
onTap |
Map<String, VoidCallback>? |
null | Mappa dei nomi dei placeholder ai callback al tap |
style |
TextStyle? |
null | Stile di base per il testo non-placeholder |
Tutti gli altri parametri (softWrap, textAlign, maxLines, ecc.) sono gli stessi del costruttore children.
Estensioni Text
Nylo Website estende il widget Text di Flutter con metodi tipografici e di utilita'.
Stili Tipografici
Applica stili tipografici Material Design a qualsiasi widget Text:
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()
Ciascuno accetta override opzionali:
Text("Welcome").headingLarge(
color: Colors.blue,
fontWeight: FontWeight.w700,
letterSpacing: 1.2,
)
Override disponibili (uguali per tutti i metodi tipografici):
| Parametro | Tipo | Descrizione |
|---|---|---|
color |
Color? |
Colore del testo |
fontSize |
double? |
Dimensione del font |
fontWeight |
FontWeight? |
Peso del font |
fontStyle |
FontStyle? |
Corsivo/normale |
letterSpacing |
double? |
Spaziatura tra le lettere |
wordSpacing |
double? |
Spaziatura tra le parole |
height |
double? |
Altezza della riga |
decoration |
TextDecoration? |
Decorazione del testo |
decorationColor |
Color? |
Colore della decorazione |
decorationStyle |
TextDecorationStyle? |
Stile della decorazione |
decorationThickness |
double? |
Spessore della decorazione |
fontFamily |
String? |
Famiglia del font |
shadows |
List<Shadow>? |
Ombre del testo |
overflow |
TextOverflow? |
Comportamento di overflow |
Metodi di Utilita'
// 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),
)
Esempi
Link Termini e Condizioni
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"),
},
)
Visualizzazione della Versione
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),
},
)
Paragrafo con Stili Misti
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."),
],
)
Catena Tipografica
Text("Welcome Back")
.headingLarge(color: Colors.black)
.alignCenter()