如何在Flutter中给文本加下划线


120

如何在Text小部件内的flutter中的文本下划线?

我似乎找不到内在fontStyle属性的下划线TextStyle

Answers:


274

强调所有内容时,可以在“文本”小部件上设置TextStyle。

在此处输入图片说明

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,这是一个很好的问题。它可能与基线有关。我想对此做更多探索,但是我还不知道该怎么做。探索源代码,让我知道是否可以解决。
Suragch

在文本和下划线之间添加空格存在一个开放的问题。 github.com/flutter/flutter/issues/30541
Joe Muller

@felangga请参阅以下有关两种解决方案的答案,这两种解决方案可让您增加文本和下划线之间的距离
Joe Muller

感谢您的努力和解释
Sana'a Al-ahdal

34

您可以通过向申请decoration: TextDecoration.underlineTextStyle实现Text

以主题为例:

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

基本示例:

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


3

激动人心的解决方案
如果您想控制文本和下划线之间的距离,可以使用此技巧。简而言之,您可以使用Colors.transparent隐藏实际文本,然后显示一个悬停在Text下划线上方的偏移阴影。

        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(颜色:Colors.black,偏移量:Offset(0,-5)) ],);
Sathish Kumar

太好了,谢谢
roun paleum

@乔,非常聪明!我偷走了您的解决方案的一部分,并将其应用于此处的问题(试图给您带来荣誉,但它未链接到您的个人资料):stackoverflow.com/q/65293992/1459653谢谢!
Mark Gavagan

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.