如何加粗(或格式化)段落中的一段文字?

How do I bold (or format) a piece of text within a paragraph?

如何让一行文本具有不同的格式?

例如:

你好世界

您应该使用 RichText 小部件。

RichText 小部件将采用 TextSpan 小部件,该小部件也可以包含子 TextSpans 列表。

每个 TextSpan 小部件可以有不同的 TextStyle

这是要呈现的示例代码: 你好世界

var text = RichText(
  text: TextSpan(
    // Note: Styles for TextSpans must be explicitly defined.
    // Child text spans will inherit styles from parent
    style: const TextStyle(
      fontSize: 14.0,
      color: Colors.black,
    ),
    children: <TextSpan>[
      TextSpan(text: 'Hello'),
      TextSpan(text: 'World', style: const TextStyle(fontWeight: FontWeight.bold)),
    ],
  ),
);

[更新]

下面的答案最适合几个单词而不是一个段落,如果你有一个长句子或一个段落,你需要在上面的答案中按照@DvdWasibi 的建议使用 RichText 来格式化特定文本

[旧答案]

我喜欢保持我的代码简洁明了,这就是我会如何在一行中添加两个文本字段,一个使用普通字体,另一个使用 粗体,

注意:这可能不适合长段落看起来适合标题等

Row(children: [
  Text("Hello"),
  Text("World", style: const TextStyle(fontWeight: FontWeight.bold))
]);

你应该得到一个想要的输出“Hello World

return RichText(
  text: TextSpan(
    text: 'Can you ',
    style: TextStyle(color: Colors.black),
    children: <TextSpan>[
      TextSpan(
        text: 'find the',
        style: TextStyle(
          color: Colors.green,
          decoration: TextDecoration.underline,
          decorationStyle: TextDecorationStyle.wavy,
        ),
        recognizer: _longPressRecognizer,
      ),
      TextSpan(text: 'secret?'),
    ],
  ),
);

正则表达式

您可以使用这个小部件。下面的示例总是将数字加粗。

import 'package:flutter/material.dart';

class TextBold extends StatelessWidget{
  final String text;
  final String regex;
  static const _separator = " ";

  const TextBold({Key key, this.text, this.regex = r'\d+'}) : super(key: key);

  @override
  Widget build(BuildContext context) {

    final parts = splitJoin();

    return Text.rich(TextSpan(
        children: parts.map((e) => TextSpan(
            text: e.text,
            style: (e.isBold)
                ? const TextStyle(fontFamily: 'bold')
                : const TextStyle(fontFamily: 'light')))
            .toList()));
  }

  // Splits text using separator, tag ones to be bold using regex
  // and rejoin equal parts back when possible
  List<TextPart> splitJoin(){
    assert(text!=null);

    final tmp = <TextPart>[];

    final parts = text.split(_separator);

    // Bold it
    for (final p in parts){
      tmp.add(TextPart(p + _separator,p.contains(RegExp(regex))));
    }

    final result = <TextPart>[tmp[0]];
    // Fold it
    if (tmp.length>1) {
      int resultIdx = 0;
      for (int i = 1; i < tmp.length; i++)
        if (tmp[i - 1].isBold != tmp[i].isBold) {
          result.add(tmp[i]);
          resultIdx++;
        }
        else
          result[resultIdx].text = result[resultIdx].text
              + tmp[i].text;
    }

    return result;
  }
}

class TextPart{
  String text;
  bool isBold;

  TextPart(this.text, this.isBold);
}

您应该使用 Text class here.

中的 Text.rich 构造函数

通过使用 rich 构造函数,您可以显示具有不同样式的段落 TextSpans

为什么我推荐它而不是 RichText 是因为使用 RichText 你需要在 RichText 中定义父 TextStyle 但使用 rich Text 的构造函数你不需要在 Text.rich

中显式定义父 TextStyle

这是如何使用它并获得相同结果的示例 使用 RichText

const text = RichText(
  text: TextSpan( 
    // Here is the explicit parent TextStyle
    style: new TextStyle(
      fontSize: 16.0,
      color: Colors.black,
      fontFamily: 'Montserrat', 
    ),
    children: <TextSpan>[
      new TextSpan(text: 'Hello'),
      new TextSpan(text: 'World', style: new TextStyle(fontWeight: FontWeight.bold)),
    ],
  ),
 );

使用 Text

rich 构造函数
const text = Text.rich(
  TextSpan(
    // with no TextStyle it will have default text style
    text: 'Hello',
    children: <TextSpan>[
      TextSpan(text: 'World', style: TextStyle(fontWeight: FontWeight.bold)),
    ],
  ),
)

另一种方法:

Row(
      children: [
        Text("Hello "),
        Text("World",
            style: TextStyle(
                fontWeight: FontWeight.bold, color: Colors.blueAccent)),
      ],
);

未完全测试,但您可以尝试使用 Text.rich 并接收 fullTexttextToBold 然后 returns 文本的辅助函数:

static Text boldTextPortion(
    String fullText,
    String textToBold,
) {
    final texts = fullText.split(textToBold);
    final textSpans = List.empty(growable: true);
    texts.asMap().forEach((index, value) {
      textSpans.add(TextSpan(text: value));
      if (index < (texts.length - 1)) {
        textSpans.add(TextSpan(
          text: textToBold,
          style: const TextStyle(fontWeight: FontWeight.bold),
        ));
      }
    });
    return Text.rich(
      TextSpan(
        children: <TextSpan>[...textSpans],
      ),
    );
}

我已经通过使用 flutter_html 小部件为不同的标签自定义样式解决了类似的问题。 实际上,我有不同语言的字符串,它们的某些部分应该是粗体,所以要确定我应该将字符串的哪一部分设为粗体并不容易,因为字符串在 l10n 语言环境文件中。这是示例:

Container(
   child: Html(
              data: "<p>My normal text <b>with bold part</b> in any place</p>",
              style: {
                "p": Style(
                    fontSize: FontSize.large,
                    fontWeight: FontWeight.normal),
                "b": Style(
                  fontWeight: FontWeight.bold,
                ),
    )
 );

如果您的常规文本中有很多不同样式的文本,我认为这种方法很有用。