В документах TextDirection говорится:
Flutter разработан для удовлетворения потребностей приложений, написанных на любом из языков, используемых в настоящее время в мире, независимо от того, используют ли они направление письма справа налево или слева направо. Flutter не поддерживает другие режимы написания, такие как вертикальный текст или бустрофедонный текст, поскольку они редко используются в компьютерных программах. (курсив мой)
Flutter не только не поддерживает вертикальный текст, но и не будет официально поддерживаться в будущем. Это было раннее дизайнерское решение (см. здесь и здесь).
Тем не менее, сегодня есть реальная польза от поддержки вертикального скрипта. Помимо некоторых видов использования на китайском и японском, тег традиционное монгольское письмо требует этого. Этот сценарий очень часто используется в компьютерных программах во Внутренней Монголии (пример, пример, пример, пример, пример, пример).
Он пишется сверху вниз, а строки переносятся слева направо:
Кроме того, символы эмодзи и CJK сохраняют свою ориентацию при вертикальном отображении (не обязательно, но желательно). На изображении ниже верхний абзац показывает текущую реализацию, а нижний абзац показывает правильный вертикальный рендеринг:
// sample text
ᠨᠢᠭᠡ ᠬᠣᠶᠠᠷ ᠭᠣᠷᠪᠠ ᠳᠥᠷᠪᠡ ᠲᠠᠪᠤ ᠵᠢᠷᠭᠤᠭᠠ ᠳᠣᠯᠣᠭᠠ ᠨᠠᠢᠮᠠ ᠶᠢᠰᠦ ᠠᠷᠪᠠ one two three four five six seven eight nine ten ????????汉字 한국어 モンゴル語 English? ᠮᠣᠩᠭᠣᠯ︖
Поскольку Flutter не поддерживает вертикальный скрипт, он должен быть реализован с нуля. Весь фактический макет текста и рисование выполняются в движке Flutter с помощью LibTxt, поэтому я не могу это изменить.
Что потребуется для создания виджета с вертикальным текстом сверху вниз?
Обновлять
Я все еще ищу ответ. Ответ Реми хорош для однострочного текста, но не работает для многострочного текста.
В настоящее время я исследую три различных возможных решения:
- Создайте подкласс RenderObject (или, возможно, подкласс RenderParagraph), который поддерживает настраиваемый StatelessWidget похож на виджет RichText.
- Используйте виджет CustomPaint
- Создайте составной виджет из ListView (одна строка на текстовую строку), текстовых виджетов и WidgetSpans.
Все это потребовало бы измерения текста, его разметки и получения списка строк.
Еще одно обновление
В настоящее время я склоняюсь к созданию собственного виджета и объекта рендеринга, который будет имитировать RichText и RenderParagraph. Под капотом RenderParagraph использует TextPainter для компоновки и раскрашивания текста. Моя проблема сейчас в том, что TextPainter тесно связан с базовой библиотекой Skia LibTxt. Вот где происходит собственно макет и покраска. Размещение текста чем-либо, кроме стандартных ltr и rtl, оказывается большой проблемой.
Еще одно обновление
Принятый ответ соответствует критериям, которые я сформулировал в этом вопросе. Я думаю, что это удовлетворит краткосрочные потребности. У меня есть некоторые оговорки по поводу применения стиля текста, но мне нужно будет провести больше тестов. В долгосрочной перспективе я все еще могу попытаться сделать собственный макет текста и рисование.