TextDirection 在 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));

结果:

enter image description here

但是将方向更改为 TextDirection.rtl,您将得到以下结果:

enter image description here

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...