TextDirection 在 Flutter 中到底做了什么

What does TextDirection really do in Flutter

使用 TextDirection 有什么区别。在 Flutter 中到处都需要它,但目的不明确。

例如,给定以下代码:

const text = 'Hello';
final textSpan = const TextSpan(
  text: text,
  style: TextStyle(fontSize: 50, color: Colors.black),
);

final TextPainter textPainter = TextPainter()
  ..textDirection = TextDirection.ltr
  ..text = textSpan
  ..layout();
textPainter.paint(canvas, Offset(0, 0));

文本方向设置为TextDirection.ltr。这会打印 Hello.

但是,将文本方向设置为 TextDirection.rtl 不会给出 olleH。还是Hello。那么TextDirection的目的是什么?

TextDirection 不会更改从左到右 (LTR) 文本(如英语或俄语)中的字符顺序。它也不会更改从右到左 (RTL) 文本(如阿拉伯语或希伯来语)中的字符顺序。

TextDirection 的作用是在 LTR 和 RTL 文本出现在同一字符串(即双向文本)中时更改它们的顺序块。

您可以在以下示例中看到这一点:

const text = 'Hello שלום';

该字符串包含 LTR 文本 (Hello) 和 RTL 文本 (שלום)。 LTR 文本出现在字符串的开头。所以当你在 LTR 环境中时,Hello 应该画在左边(第一个),שלום 画在右边(最后一个)。

确实,您可以观察到这是真的:

const text = 'Hello שלום';
final textSpan = const TextSpan(
  text: text,
  style: TextStyle(fontSize: 30, color: Colors.black),
);
final TextPainter textPainter = TextPainter()
  ..textDirection = TextDirection.ltr  //       <-- LTR
  ..text = textSpan
  ..layout();
textPainter.paint(canvas, Offset(0, 0));

这导致:

但是将方向改为TextDirection.rtl,你会得到如下结果:

Hello 仍然是第一个,但由于现在环境是 RTL,这意味着第一个在右边。 שלום 仍然是最后一个,但现在最后一个在左边。有趣的是,space在他们之间保持。