Flutter:如何增加文本中制表符“\t”的缩进宽度

3
我有一个小部件,用于打印文本:
class NormalText extends StatelessWidget {
  final String txt;

  NormalText(this.txt) {}

  @override
  Widget build(BuildContext context) {
    return Container(
        child: Text(txt,
            style: TextStyle(
                color: Colors.grey,
                fontSize: 20,
                fontWeight: FontWeight.bold)));
  }
}

但是,如果我像这样使用它:

NormalText('hello\tworld\t42')

这个缩进太小了。是否有办法增加缩进,占用更多的空间?

4个回答

2
如果您仍希望保留单词之间的空格,并仅增加制表符,您可以使用Wrap小部件。
            Wrap(
              children: "hello hello\tworld\t42"
                  .split("\t")
                  .map((text) => Text(text))
                  .expand((element) => [
                        element,
                        SizedBox(
                          width: 50,
                        )
                      ])
                  .toList()
                    ..removeLast(),
            ),

SizedBox 对我来说是一个非常简单的解决方案! - Carl Smith

1
您可以使用 wordSpacing 参数。
Text(
  'Build some widgets!',
  style: TextStyle(
      height: 1.2 ,
      wordSpacing: 6,
      letterSpacing: 1.0,
   )
),

在我给出的例子中它可以工作,但显然我正在使用这个小部件来处理更复杂的文本,我很了解wordSpacing,但我想使用\t而不是空格。 - Antonin GAVREL
你想在特定单词之间留出空格吗? - Sanjay Sharma
我在单词之间使用空格和制表符的混合。目前我找到了一个“解决方案”,即简单地使用4个空格代替\t,但感觉有点遗憾。 - Antonin GAVREL
我仍然不确定需求。你可以尝试使用RichText进行探索。 - Sanjay Sharma

0

您可以结合使用 \t 来获得更多的 制表符空格

请查看下面的代码示例:

// combine two \t
print('hello\t\tworld\t42');

1
我已经尝试过了。希望能够直接配置一个 \t 中包含的宽度或空格数量。 - Antonin GAVREL

0

你可以在你的TextField上设置一个{{link1:TextEditingController}},然后用一个文本样式设置letterSpacing为20来替换每个制表符。

在你的小部件中使用你的文本字段:

final tabController = TabTextController();

@override
Widget build(BuildContext context) {
  return TextField(controller: tabController);
}

您的自定义TextEditingController:

class TabTextController extends TextEditingController {
  @override
  TextSpan buildTextSpan(
      {required BuildContext context,
      TextStyle? style,
      required bool withComposing}) {
    List<TextSpan> children = [];

    text.splitMapJoin(
      RegExp(r'\t'),
      onMatch: (match) {
        children.add(
            TextSpan(text: '\t', style: style?.copyWith(letterSpacing: 20)));
        return '';
      },
      onNonMatch: (string) {
        children.add(TextSpan(text: text, style: style));
        return '';
      },
    );

    return TextSpan(children: children, style: style);
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接