老孟导读:此文翻译自:https://medium.com/@suragch/my-first-disappointment-with-flutter-5f6967ba78bf

我喜欢Flutter。我喜欢开发一次并让代码在Android和iOS上运行。我喜欢节省多少时间。我喜欢现在成为一名Web开发人员,而无需做任何额外的工作。我喜欢hot reload。我喜欢通过将小部件组合到布局中来快速构建UI。我喜欢制作ListView简单得多。我喜欢状态管理。 (好吧,只是在开玩笑。但是我可以应付。)我喜欢Dart。我喜欢Future和async / await比Android AsyncTasks甚至iOS Dispatch Queue容易得多。

但是,在花了最后两周的时间研究Flutter如何呈现文本后,我对使用的工具感到失望。

我们被告知:

Flutter的分层体系结构使您可以控制屏幕上的每个像素。

这显然不适用于用于绘制文本的像素。

Flutter中的低级文字功能

Flutter使用名为LibTxt的库结合使用Skia,Hafbuzz,Minikin和ICU来呈现文本。开发人员在使用Text小部件或TextSpan甚至是TextPainter时间接使用它。在最低级别上,我们可以使用dart:iu,它是使用ParagraphBuilder构建的Paragraph类。这些类基本上只是底层LibTxt引擎的包装器。几乎所有工作都由此引擎完成,而在dart:ui中几乎没有暴露。

Paragraph类为我们提供了以下控制:

  • Size:我可以获取整个渲染段落的宽度和高度,它可以是单行或多行。
  • 距基线的距离(仅对于第一行)
  • 文本是否溢出了maxLines变量。
  • 文本框的大小和相对位置。这是一个例子:

  • 最接近某个像素位置的文本字符索引。在上面的示例中,像素(1、1)对应于字符串中的索引0,即“My text line.”的字母“ M”。
  • 字符串中某些字符偏移的单词边界。

随后的更新也为我们提供了LineMetrics,它为每行提供了许多详细信息:

class LineMetrics {final bool hardBreak;final double ascent;final double descent;final double unscaledAscent;final double height;final double width;final double left;final double baseline;final int lineNumber;
}

但是,我们没有得到:

  • 一种在文本框中获取实际文本的方法。
  • 一种控制文本布局方式的方法。
  • 一种在路径上绘制文本的方法。
  • 一种无需绘制整个段落即可测量和绘制短文本的方法。
  • 一种从文本字符串获取换行位置的方法

与Android和iOS的比较

在Android中,尽管大多数人会使用TextView,但是您可以通过使用StaticLayout,Canvas和Paint类获得低级控件来执行上面列出的所有操作。以下是可用的众多选项中的几个:

  • [Canvas.drawTextOnPath](https://developer.android.com/reference/android/graphics/Canvas.html#drawTextOnPath(java.lang.String, android.graphics.Path, float, float, android.graphics.Paint))
  • [Canvas.drawTextRun](https://developer.android.com/reference/android/graphics/Canvas.html#drawTextRun(char[], int, int, int, int, float, float, boolean, android.graphics.Paint))
  • Paint.getFontMetrics
  • [Paint.measureText](https://developer.android.com/reference/android/graphics/Paint.html#measureText(java.lang.String, int, int))

我在iOS上没有那么低级的文字绘制经验(因为我认为我只会学习在Flutter中做所有事情),但是Core Text具有丰富的工具集。

Flutter 指南中如此说:

以多个平台为目标的SDK是很常见的……提供可在所有目标平台上运行的API。不幸的是,这通常意味着一个平台或另一个平台独有的功能不可用。

对于Flutter,我们希望通过明确地成为每个平台的最佳开发方式来避免这种情况。我们在跨平台上使用的能力仅次于我们在每个平台上使用的能力。 (添加了重点)

当前,对于需要在应用程序中进行低级文本渲染的我们当中,Flutter并不是最好的开发平台。

用例

您可能会说Flutter已经提供了Text和RichText小部件。是的,他们非常好。他们将满足99.9%的开发人员的需求。但是,存在使用较低级别的文本呈现工具的用例。

蒙文

我的用例是布局并渲染传统的蒙古文字,该文字垂直书写,并从左到右换行。英语是侧身书写,但CJK和表情符号字符应保持其正常方向。

有一些使用小部件组合的“解决方案”,但是当您添加文本样式的需要时(例如通过在文本的右侧绘制一条垂直线来“下划线”),一种更可靠的解决方案是处理所有文本手工测量,布置和绘画。我已经开始在这里工作了。

中文,日文和韩文

中文,日文和韩文也可以按各种垂直方向进行布局。像蒙古语一样,有一种解决方法,可以解决一次性情况,但对于常用用法,渲染包会更有帮助。阅读此内容以更详细地描述需求。

Flutter仅支持支持从右到左和从左到右的布局。不支持(也不支持

我对Flutter的第一次失望相关推荐

  1. flutter 阿里 号码认证_我对Flutter的第一次失望

    老孟导读:此文翻译自:https://medium.com/@suragch/my-first-disappointment-with-flutter-5f6967ba78bf 我喜欢Flutter. ...

  2. 关于Flutter初始化流程,我必须告诉你的是...

    作者:闲鱼技术-然道 1. 引言 最近在做性能优化的时候发现,在混合栈开发中,第一次启动Flutter页面的耗时总会是第二次启动Flutter页面耗时的两倍左右,这样给人感觉很不好.分析发现第一次启动 ...

  3. Archsummit 2019重磅分享|闲鱼Flutter&FaaS云端一体化架构

    作者:闲鱼技术-国有 讲师介绍 国有,闲鱼架构团队负责人.在7月13号落幕的2019年Archsummit峰会上就近一年来闲鱼在Flutter&FaaS一体化项目上的探索和实践进行了分享. 传 ...

  4. 跟我一步一步实现 Flutter 视频播放插件 (一)

    当团队准备着手做 APP 时,我们把目标对准了 Flutter,尤其近期 Flutter 的使用热度一直不断攀升.由于第一次使用 Flutter,就想通过自己的实践去提升自己的能力. 在做 APP 时 ...

  5. 闲鱼架构专家,详解Flutter技术架构15页ppt:跨端方案如何选择?

    文/技术领导力社区 编辑/Emma 闲鱼架构团队负责人国有.技术专家宗心.灯阳,在文章及公开分享中介绍了Flutter在闲鱼的实践,内容包括:选择Flutter的背景和思考.闲鱼的Flutter新混合 ...

  6. 军营中重重打击之后,我变了一个人(上)--我成为程序员所经历的(四)

    无助的时候只能靠自己,幸好我是公务员<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office&q ...

  7. 一个人越来越沉默,即便是对着家人也无话可说,这究竟是怎么了?

    我曾经是一个很喜欢说的人,但是随着工作和生活阅历的变化,慢慢的我也成为了一个喜欢沉默的人,甚至有时候我自己也在想:"现在的我,是我自己吗?"但回头看看曾经跟领导.同事.朋友.家人的 ...

  8. 我的三年Android开发总结之回忆过去

    从2015年10月进入第一家公司实习,从事Android开发到现在,不知不觉已有三年之久.这期间我做过不少项目,从事许多技术框架的研究以及开发,也写过许多技术博客,进行多次的技术分享,从事过QQ技术群 ...

  9. 科技公司面试经:我是如何获得Facebook工作机会的?

    全文共2753字,预计学习时长9分钟 图源:pixabay 我在三星电子做了两年的软件工程师,一直在计划跳槽.最初开始找工作时,我根本没敢想自己可以有机会在Facebook工作,然而仅仅五个月后后我收 ...

最新文章

  1. UOJ #164 [清华集训2015]V (线段树)
  2. VTK:绘图之AreaPlot
  3. python商品总价_【Python基础 | 列表】小实验:实现显示商品,选择商品,将商品加入购物车,得到总价格...
  4. zblog php伪静态,zblogphp如何设置伪静态
  5. Linux操作系统使用基础05:Linux磁盘与文件系统管理
  6. 谷歌 AI 中国中心彻底变天了!
  7. 如何让同局域网的同事访问我电脑上的PHP网站和数据库
  8. You don’t have permission to access / on this server
  9. pdf怎么解除限制打印
  10. CSS设计模式读书笔记
  11. 利用python进行数据分析(4)
  12. ASML公司Q3季度营收27.9亿欧元
  13. 人工智能期末考试复习(贲可荣 张彦铎)
  14. java发送邮件格式_java使用main函数进行邮件发送怎样设置邮件格式
  15. android随手记(持续更新)
  16. 赛门铁克未署名诺顿安全更新 防火墙警报引混乱
  17. 冒泡排序及其时间、空间复杂度解析
  18. SIGIR2020推荐系统论文聚焦
  19. HAUT2021蓝桥杯专题练习第四周记录——贪心
  20. Dilated Convolution膨胀卷积感受野详解

热门文章

  1. No connection could be made because the target machine actively refused it 127.0.0.1:8888
  2. zuk android os 流量,国产机首发? ZUK Z1或12月推送安卓6.0
  3. 14.PG分区表-传统分区表
  4. 电荷放大器的原理与应用
  5. ESP32使用双cpu同时工作测试-arduino开发环境
  6. 怎么简单刷机?安卓刷机的使用教程
  7. python 翻转棋(othello)
  8. oracle数据库dba面试题,DBA笔试题5:SQL汇总
  9. 大数据精准投放+优质内容营销 帮你找到用户更能留住用户!
  10. 流氓软件卸载之——WPS猎豹热点