Flutter设计用于满足使用世界上任何当前使用的语言编写的应用程序的需求,无论它们使用从右到左还是从左到右的书写方向。 Flutter不支持其他书写模式,例如竖排文字或“奇偶行转向”(boustrophedon)文本,因为这些在计算机程序中很少使用。(强调添加) Flutter不仅不支持竖排文字,而且将来也不会得到官方支持。 这是早期的设计决策(请参见此处和此处)。
即使如此,在今天,有真正需要垂直字母支持的用例。 除了某些中文和日文用途外,传统蒙古文字也需要垂直书写。 在内蒙古的计算机程序中非常普遍使用此脚本(示例,示例,示例,示例,示例,示例)。
它是从上到下书写的,并且行从左到右换行:
![enter image description here](https://istack.dev59.com/vegbv.webp)
![enter image description here](https://istack.dev59.com/QQUup.webp)
// sample text
ᠨᠢᠭᠡ ᠬᠣᠶᠠᠷ ᠭᠣᠷᠪᠠ ᠳᠥᠷᠪᠡ ᠲᠠᠪᠤ ᠵᠢᠷᠭᠤᠭᠠ ᠳᠣᠯᠣᠭᠠ ᠨᠠᠢᠮᠠ ᠶᠢᠰᠦ ᠠᠷᠪᠠ one two three four five six seven eight nine ten 汉字 한국어 モンゴル語 English? ᠮᠣᠩᠭᠣᠯ︖
由于Flutter不支持竖排文字,必须从头开始实现。所有实际的文本布局和绘画都在Flutter引擎中使用LibTxt完成,所以我不能改变这个。
创建一个自上而下的垂直文本widget需要涉及什么?
更新
我仍在寻找答案。Rémi的答案适用于单行文本,但对多行文本无效。
我目前正在研究三种不同的可能解决方案:
- 创建一个RenderObject子类(或者可能是RenderParagraph子类),支持自定义StatelessWidget类似于RichText widget。
- 使用CustomPaint widget
- 制作一个复合widget,其中包含ListView(每行一个文本行),Text widget和WidgetSpans。
所有这些都涉及测量文本,布局文本并获取一组文本行。
另一个更新
我目前倾向于制作自定义widget和渲染对象,模仿RichText和RenderParagraph。在幕后,RenderParagraph使用TextPainter来布局和绘制文本。我的问题现在是TextPainter与底层的Skia LibTxt库紧密耦合。除了默认的从左到右和从右到左之外,将文本布局在其他任何位置都是一个大问题。
另一个更新
所接受的答案符合我在此问题中提出的标准。我认为它能够满足短期需求。对于应用文本样式等事项,我还有一些保留意见,但我需要进行更多测试。长期来看,我可能仍然会尝试进行自定义文本布局和绘画。