196 votes

Comment souligner du texte en flutter

Comment souligner du texte dans flutter à l'intérieur du widget Text ?

Je ne semble pas trouver de soulignement à l'intérieur de la propriété fontStyle de TextStyle

443voto

Suragch Points 197

Lorsque vous soulignez tout, vous pouvez définir un TextStyle sur le widget Text.

description de l'image ici

Text(
  'Bonjour le monde',
  style: TextStyle(
    decoration: TextDecoration.underline,
  ),
)

Si vous voulez uniquement souligner une partie du texte, alors vous devez utiliser Text.rich() (ou un widget RichText) et diviser la chaîne en TextSpans auxquels vous pouvez ajouter un style.

description de l'image ici

Text.rich(
  TextSpan(
    text: 'Bonjour ',
    style: TextStyle(fontSize: 50),
    children: [
      TextSpan(
          text: 'le monde',
          style: TextStyle(
            decoration: TextDecoration.underline,
          )),
      // vous pouvez ajouter plus de TextSpans ici...
    ],
  ),
)

TextSpan est un peu étrange. Le paramètre text est le style par défaut mais la liste children contient le texte stylé (et éventuellement non stylé) qui le suit. Vous pouvez utiliser une chaîne vide pour text si vous voulez commencer avec du texte stylé.

Vous pouvez également ajouter un TextDecorationStyle pour modifier l'apparence de la décoration. Voici en pointillé :

description de l'image ici

Text(
  'Bonjour le monde',
  style: TextStyle(
    decoration: TextDecoration.underline,
    decorationStyle: TextDecorationStyle.dashed,
  ),
)

et TextDecorationStyle.dotted:

description de l'image ici

et TextDecorationStyle.double:

description de l'image ici

et TextDecorationStyle.wavy:

description de l'image ici

28 votes

Est-il possible d'ajouter de l'espace entre les mots et souligner la ligne ?

0 votes

@felangga, C'est une bonne question. Cela serait probablement lié à la ligne de base. C'est quelque chose que je veux explorer davantage, mais je ne sais pas encore comment le faire. Explorez le code source et faites-moi savoir si vous parvenez à le comprendre.

1 votes

Il y a un problème ouvert pour ajouter de l'espace entre le texte et le soulignement. github.com/flutter/flutter/issues/30541

44voto

Tree Points 5388

Vous le faites en appliquant décoration: TextDecoration.underline à TextStyle d'un Text.

Avec l'exemple de Thème :

          Text(
            "text",
            style: Theme
                .of(context)
                .accentTextTheme
                .subhead
                .copyWith(decoration: TextDecoration.underline),
          )

Exemple basique :

          Text(
            "text",
            style: TextStyle(decoration: TextDecoration.underline),
          )

43voto

Joe Muller Points 2242

Solution excitante
Si vous souhaitez avoir le contrôle sur la distance entre le texte et le soulignement, vous pouvez utiliser cette astuce. En bref, vous masquez le texte réel en utilisant Colors.transparent puis affichez une ombre décalée qui plane au-dessus du soulignement du texte.

        Text(
            "Mot de passe oublié?",
            style: TextStyle(
              shadows: [
                Shadow(
                    color: Colors.black,
                    offset: Offset(0, -5))
              ],
              color: Colors.transparent,
              decoration:
              TextDecoration.underline,
              decorationColor: Colors.blue,
              decorationThickness: 4,
              decorationStyle:
              TextDecorationStyle.dashed,
            ),
          )

entrer la description de l'image ici

Comme vous le verrez ci-dessous, si vous utilisez le soulignement de texte standard, il reste collé au bas du texte et peut sembler un peu laid,

Solutions ennuyeuses

En utilisant simplement le widget Text, vous pouvez ajouter le soulignement avec un style et une couleur personnalisés :

Text(
  "Mot de passe oublié?",
  style: TextStyle(
    decoration: TextDecoration.underline,
    decorationColor: Colors.blue,
    decorationThickness: 4,
    decorationStyle: TextDecorationStyle.dashed,
   ),
)

Le seul problème que je vois avec cette approche est que vous n'avez aucun contrôle sur la proximité du soulignement par rapport au bas du texte.

entrer la description de l'image ici

Si vous souhaitez augmenter l'espacement, vous devrez utiliser une approche non conventionnelle qui utilise Container et sa propriété de remplissage.

Container(
     padding: EdgeInsets.only(
       bottom: 5, // Espace entre le soulignement et le texte
     ),
     decoration: BoxDecoration(
         border: Border(bottom: BorderSide(
         color: Colors.amber, 
         width: 1.0, // Épaisseur du soulignement
        ))
      ),
     child: Text(
        "Mot de passe oublié?",
        style: TextStyle(
        color: Colors.black,
        ),
       ),
      )

entrer la description de l'image ici

Gardez un œil sur ce problème GitHub pour une solution plus simple.

0 votes

Encore une autre solution moche utilisant des ombres. Style de réponse final = TextStyle( decoration: TextDecoration.underline, decorationStyle: TextDecorationStyle.dashed, color: Colors.transparent, decorationColor: Colors.black, shadows: [Shadow(color: Colors.black, offset: Offset(0, -5))], );

0 votes

Il est tellement agréable merci

0 votes

@Joe, Très astucieux ! J'ai volé une partie de votre solution et l'ai appliquée à mon problème ici (j'ai essayé de vous donner du crédit, mais le lien vers votre profil n'a pas fonctionné) : stackoverflow.com/q/65293992/1459653 Merci !

4voto

Anjali Kunder Points 11

Vous pouvez utiliser TextDecoration dans le style pour souligner un texte donné.

Par exemple

Text(
    "Votre texte ici",
    style: TextStyle(
        decoration: TextDecoration.underline),
    )
)

4voto

Par exemple

Texte(
  "Termes et Conditions",
  style: TextStyle(
    decoration:
        TextDecoration.underline,
    height: 1.5,
    fontSize: 15,
    fontWeight: FontWeight.bold,
    fontFamily: 'Roboto-Regular',
  ),
),

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X