Як підкреслити текст у трепет


120

Як підкреслити текст, що лунає всередині Textвіджета?

Я не можу знайти підкреслення всередині fontStyleвластивостіTextStyle

Відповіді:


277

Підкреслюючи все, ви можете встановити TextStyle на віджеті Text.

введіть тут опис зображення

Text(
  'Hello world',
  style: TextStyle(
    decoration: TextDecoration.underline,
  ),
)

Якщо ви хочете лише підкреслити частину тексту, вам потрібно використовувати Text.rich()(або віджет RichText) і розбити рядок на TextSpans, до якого ви можете додати стиль.

введіть тут опис зображення

Text.rich(
  TextSpan(
    text: 'Hello ',
    style: TextStyle(fontSize: 50),
    children: <TextSpan>[
      TextSpan(
          text: 'world',
          style: TextStyle(
            decoration: TextDecoration.underline,
          )),
      // can add more TextSpans here...
    ],
  ),
)

TextSpan трохи дивний. textПараметр за замовчуванням стиль , але childrenсписок містить текст у стилі (і , можливо , без стилів) , які слідують його. Ви можете використовувати порожній рядок, textякщо хочете почати зі стилізованого тексту.

Ви також можете додати TextDecorationStyle, щоб змінити вигляд прикраси. Ось пунктир:

введіть тут опис зображення

Text(
  'Hello world',
  style: TextStyle(
    decoration: TextDecoration.underline,
    decorationStyle: TextDecorationStyle.dashed,
  ),
)

і TextDecorationStyle.dotted:

введіть тут опис зображення

і TextDecorationStyle.double:

введіть тут опис зображення

і TextDecorationStyle.wavy:

введіть тут опис зображення


12
Чи можна додати пробіл між словами та підкресленою лінією?
felangga

@felangga, це гарне запитання. Можливо, це було б пов’язано з базовим рівнем. Це те, що я хочу дослідити більше, але поки не знаю, як це зробити. Дослідіть вихідний код і дайте мені знати, якщо ви це зрозумієте.
Сурагч

Існує відкрите питання про додавання пробілу між текстом та підкресленням. github.com/flutter/flutter/issues/30541
Джо Мюллер

@felangga див. мою відповідь нижче щодо двох рішень, що дозволяють збільшити простір між текстом та підкресленням
Джо Мюллер

Дякую за зусилля та пояснення
Сана Аль-Ахдал,

34

Ви робите це шляхом застосування decoration: TextDecoration.underlineдо TextStyleз Text.

На прикладі теми:

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

Основний приклад:

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

3

Ви можете використовувати TextDecoration у стилі, щоб підкреслити заданий текст.

Наприклад

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

3

Захоплююче рішення
Якщо ви хочете контролювати відстань між текстом та підкресленням, ви можете скористатися цим хаком. Коротше кажучи, ви приховуєте фактичний текст за допомогою Colors.transparent, а потім відображаєте зміщену тінь, яка висить над підкресленням тексту.

        Text(
            "Forgot Password?",
            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,
            ),
          )

введіть тут опис зображення

Як ви побачите нижче, якщо ви використовуєте нестандартне підкреслення тексту, воно прилипає до нижньої частини тексту і може виглядати трохи потворно,

Нудні рішення

Використовуючи лише віджет " Текст", ви можете додати підкреслення за допомогою власного стилю та кольору:

Text(
  "Forgot Password?",
  style: TextStyle(
    decoration: TextDecoration.underline,
    decorationColor: Colors.blue,
    decorationThickness: 4,
    decorationStyle: TextDecorationStyle.dashed,
   ),
)

Єдине питання, яке я маю при такому підході, полягає в тому, що ви не маєте контролю над тим, наскільки підкреслене знаходження знаходиться внизу тексту.

введіть тут опис зображення

Якщо ви хочете збільшити інтервал, вам доведеться використовувати нетрадиційний підхід, який використовує Container та його властивість padding.

Container(
     padding: EdgeInsets.only(
       bottom: 5, // Space between underline and text
     ),
     decoration: BoxDecoration(
         border: Border(bottom: BorderSide(
         color: Colors.amber, 
         width: 1.0, // Underline thickness
        ))
      ),
     child: Text(
        "Forgot Password?",
        style: TextStyle(
        color: Colors.black,
        ),
       ),
      )

введіть тут опис зображення

Слідкуйте за цим питанням GitHub для більш простого рішення.


Ще одне потворне рішення з використанням тіней. остаточний answerStyle = TextStyle (прикраса: TextDecoration.underline, decorationStyle: TextDecorationStyle.dashed, колір: Colors.transparent, decorationColor: Colors.black, тіні: [Shadow (color: Colors.black, offset: Offset (0, -5)) ],);
Сатіш Кумар,

це так приємно дякую
roun paleum

@ Джо, дуже розумно! Я викрав частину вашого рішення і застосував його до своєї проблеми тут (намагався надати вам кредит, але це не посилало на ваш профіль): stackoverflow.com/q/65293992/1459653 Дякуємо!
Mark Gavagan

2

наприклад

Text(
  "Terms and Condition",
  style: TextStyle(
    decoration:
        TextDecoration.underline,
    height: 1.5,
    fontSize: 15,
    fontWeight: FontWeight.bold,
    fontFamily: 'Roboto-Regular',
  ),
),
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.