如何在颤振文本小部件内下划线文本?

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


当前回答

在一行中控制文本和下划线之间的距离

在Joe Muller的回答的基础上,有一种扩展方法,允许控制文本/下划线距离,而不会使小部件树的代码变得混乱。它是这样使用的:

Widget build(BuildContext context) {
  final myStyle = Theme.of(context).textTheme.headline4;

  return Text(
    'Hello, World!',
    //------------------------------------------------
    // simply apply the underlined method to the style
    style: myStyle?.underlined(distance: 2),
    //------------------------------------------------
  );
}

这是扩展:

extension TextStyleX on TextStyle {
  /// A method to underline a text with a customizable [distance] between the text
  /// and underline. The [color], [thickness] and [style] can be set
  /// as the decorations of a [TextStyle].
  TextStyle underlined({
    Color? color,
    double distance = 1,
    double thickness = 1,
    TextDecorationStyle style = TextDecorationStyle.solid,
  }) {
    return copyWith(
      shadows: [
        Shadow(
          color: this.color ?? Colors.black,
          offset: Offset(0, -distance),
        )
      ],
      color: Colors.transparent,
      decoration: TextDecoration.underline,
      decorationThickness: thickness,
      decorationColor: color ?? this.color,
      decorationStyle: style,
    );
  }
}

扩展还允许控制下划线的颜色,厚度和风格,就像任何其他下划线装饰。看看这个达特pad中一个更完整的例子。

这仍然是一个hack,但它允许在等待Flutter团队修复时保持小部件树的代码干净。

其他回答

当给所有东西加下划线时,你可以在文本小部件上设置一个TextStyle。

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

如果你只想强调文本的一部分,那么你需要使用text .rich()(或RichText小部件)并将字符串分解为可以添加样式的textspan。

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参数是默认的样式,但是子列表包含后面有样式的(也可能是无样式的)文本。如果要从样式文本开始,可以为文本使用空字符串。

你也可以添加一个TextDecorationStyle来改变装饰的外观。下面是虚线:

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

和TextDecorationStyle.dotted:

和TextDecorationStyle.double:

和TextDecorationStyle.wavy:

激动人心的解决方案 如果你想控制文本和下划线之间的距离,你可以使用这个方法。简而言之,使用Colors隐藏实际文本。然后在文本下划线上方显示偏移阴影。

        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,
   ),
)

我使用这种方法的唯一问题是,您无法控制下划线与文本底部的距离。

如果你想增加间距,你将不得不使用一种非常规的方法,使用容器和它的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问题,以获得更简单的解决方案。

风格:TextStyle ( 装饰:TextDecoration.underline, ),

在一行中控制文本和下划线之间的距离

在Joe Muller的回答的基础上,有一种扩展方法,允许控制文本/下划线距离,而不会使小部件树的代码变得混乱。它是这样使用的:

Widget build(BuildContext context) {
  final myStyle = Theme.of(context).textTheme.headline4;

  return Text(
    'Hello, World!',
    //------------------------------------------------
    // simply apply the underlined method to the style
    style: myStyle?.underlined(distance: 2),
    //------------------------------------------------
  );
}

这是扩展:

extension TextStyleX on TextStyle {
  /// A method to underline a text with a customizable [distance] between the text
  /// and underline. The [color], [thickness] and [style] can be set
  /// as the decorations of a [TextStyle].
  TextStyle underlined({
    Color? color,
    double distance = 1,
    double thickness = 1,
    TextDecorationStyle style = TextDecorationStyle.solid,
  }) {
    return copyWith(
      shadows: [
        Shadow(
          color: this.color ?? Colors.black,
          offset: Offset(0, -distance),
        )
      ],
      color: Colors.transparent,
      decoration: TextDecoration.underline,
      decorationThickness: thickness,
      decorationColor: color ?? this.color,
      decorationStyle: style,
    );
  }
}

扩展还允许控制下划线的颜色,厚度和风格,就像任何其他下划线装饰。看看这个达特pad中一个更完整的例子。

这仍然是一个hack,但它允许在等待Flutter团队修复时保持小部件树的代码干净。

你可以在样式中使用TextDecoration来强调给定的文本。

例如

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