TextDirection文档说:
Flutter 旨在满足使用世界上任何一种当前使用的语言编写的应用程序的需求,无论它们使用从右到左还是从左到右的书写方向。Flutter 不支持其他书写模式,例如竖排文本或 boustrophedon 文本,因为这些在计算机程序中很少使用。(重点补充)
Flutter 不仅不支持竖排文本,未来也不会正式支持。这是一个早期的设计决定(参见此处和此处)。
即便如此,如今垂直脚本支持仍有实际用途。除了某些中文和日文用途外,传统的蒙古文字也需要它。该脚本在内蒙古的计算机程序中非常常用(示例,示例,示例,示例,示例,示例)。
它是从上到下写的,从左到右换行:
此外,表情符号和 CJK 字符在垂直显示时保持其方向(不是绝对必要,但首选)。在下图中,顶部段落显示了当前的实现,底部段落显示了正确的垂直渲染:
// sample text
ᠨᠢᠭᠡ ᠬᠣᠶᠠᠷ ᠭᠣᠷᠪᠠ ᠳᠥᠷᠪᠡ ᠲᠠᠪᠤ ᠵᠢᠷᠭᠤᠭᠠ ᠳᠣᠯᠣᠭᠠ ᠨᠠᠢᠮᠠ ᠶᠢᠰᠦ ᠠᠷᠪᠠ one two three four five six seven eight nine ten 汉字 한국어 モンゴル語 English? ᠮᠣᠩᠭᠣᠯ︖
由于 Flutter 不支持垂直脚本,所以必须从头开始实现。所有实际的文本布局和绘画都是在 Flutter 引擎中使用LibTxt完成的,所以我无法更改。
创建一个从上到下的垂直文本小部件会涉及什么?
更新
我还在寻找答案。Rémi 的答案适用于单行文本,但不适用于多行文本。
我目前正在研究三种不同的可能解决方案:
- 创建一个支持类似于 RichText 小部件的自定义 StatelessWidget的 RenderObject 子类(或者可能是RenderParagraph子类)。
- 使用 CustomPaint 小部件
- 制作 ListView(每行一行)、Text 小部件和 WidgetSpan 的复合小部件。
所有这些都涉及测量文本、布置文本并获取行列表。
另一个更新
我目前倾向于制作一个自定义小部件和渲染对象,以模仿 RichText 和 RenderParagraph。在底层 RenderParagraph 使用 TextPainter 来布局和绘制文本。我现在的问题是 TextPainter 与底层的 Skia LibTxt 库紧密耦合。那是所有实际布局和绘画发生的地方。在默认的 ltr 和 rtl 之外的任何地方布置文本被证明是一个大问题。
又一次更新
接受的答案符合我在这个问题中提出的标准。我认为这将满足短期需求。我对应用文本样式之类的事情有一些保留,但我需要做更多的测试。从长远来看,我可能仍会尝试自定义文本布局和绘画。