老孟导读:此文翻译自: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仅支持支持从右到左和从左到右的布局。不支持(也不支持 )垂直布局。我不会对此表示怀疑。有很多工作。但是我希望他们会给我们更多工具来自己做。

艺术文字

进行文字绘画的应用程序也将从对文字绘画工具的低级别访问中受益。

用文本填充非矩形形状

为了使文本适合非矩形的内容,您必须进行大量测量。换行在哪里是另一个难题。

文字围绕排除路径流动

这在iOS中可用,但在Flutter中不可用。而且没有简单的方法可以自己实现。

结论

我并不是想说服任何人不要使用Flutter。我还是很喜欢我再也不想回到为不同平台构建同一应用程序的多次了。

在撰写本文时,我希望有人会说:“不,你错了。如果您这样做,那么您将可以使用低级文本呈现工具。”不过,我对此并没有寄予太大希望,因为Flutter的主要开发人员之一对此表示:

如果您想要“真实的”垂直文本,并带有强调标记,ruby和内联水平的bidi文本以及所有内容,那么我能提供的最好的办法是,您可以尝试使用我们提供的较差的原语编写一个程序包来支持此操作,但是可能不会是令人满意的体验。

我真正希望的是Flutter小组将为我们提供与UI布局级别一样的文本自由。添加一个dart:ui类以暴露更多LibTxt库并不是特别困难。的确,维护起来会更多,开发人员可能偶尔会用它来编写效率低下的代码,但我认为自由值得付出代价。使Flutter成为使用任何语言开发任何平台的最佳方式。

2020年2月更新

当我最初发布这篇文章时,Flutter团队迅速做出了回应(请参阅下面的评论)。许多工作正在完成(如GitHub问题所记录,谢谢Gary Qian),并且希望可能会有一些重大的改进。但是,尽管遭到了强烈支持,但该GitHub问题最终因其工作量过多而被关闭。

我最近得知,正在完成用Skia SkParagraph模块替换LibTxt的工作。这听起来很令人兴奋,但是我还不知道细节。您可以在此处跟踪进度。由于这是一项重大更改,因此现在是让Flutter团队了解您的需求与自定义文本呈现相关的好时机。请参阅以下部分。

你可以做什么

即使以下问题当前已关闭(尽管尚未解决),如果您还需要执行自定义文本呈现,请继续对其进行投票并在其上留下评论。

地址:https://github.com/flutter/flutter/issues/35994

为了将问题分解为更小的部分,我添加了以下特定功能要求。如果您还需要它们,请投票和/或评论。

  • Need a line/word breaker for custom text rendering #50171
  • Need to find how much of a long word could fit in one line before an unnatural line break #51258

我尚未提交任何具体的错误报告,但与许多小型Paragraph对象的测量和绘画效率有关。原因是我自己没有发现任何性能问题。如果您遇到过此类问题,请创建一个详细的GitHub问题,并@suragch me。我会在这里链接到它。

交流

老孟Flutter博客地址(330个控件用法):http://laomengit.com

欢迎加入Flutter交流群(微信:laomengit)、关注公众号【老孟Flutter】

flutter 阿里 号码认证_我对Flutter的第一次失望相关推荐

  1. flutter java混编_有赞 Flutter 混编方案

    背景 目前准备试水 Flutter,但是多数native开发是不了解Flutter,因此需要设计一种比较"舒服"的集成方式. 混编方案 方案考量 如果直接采用 Flutter 工程 ...

  2. 阿里python认证_集成阿里云滑动验证(python)

    阿里云的服务 数据风控下面有项滑动验证, 适合有人机验证场景的应用接入. 所谓滑动验证, 是在需要进行人机识别时, 前端出现验证滑块, 通过拖动滑块到末尾, 实现验证. 如果阿里云认为此次验证风险稍高 ...

  3. PHP之阿里号码认证服务后端取号

    引言 公司为了推广自己产品,有时会做大优惠活动,此时总会有薅羊毛党恶意刷单,为了防止这种情况,所以采用阿里号码认证服务,因为阿里号码认证服务整合了三大运营商特有的网关认证能力,一步验证手机号码和应用所 ...

  4. uni-app接入阿里云认证SDK(号码认证服务),App客户端一键登方式

    uni-app接入阿里云认证SDK(号码认证服务)App客户端一键登方式 首先,你需要了解和开通阿里云的号码认证服务,地址:https://help.aliyun.com/product/75010. ...

  5. flutter图片聊天泡泡_基于 Flutter+Dart 聊天实例 | Flutter 仿微信界面聊天室

    1.项目介绍 Flutter是目前比较流行的跨平台开发技术,凭借其出色的性能获得很多前端技术爱好者的关注,比如阿里闲鱼,美团,腾讯等大公司都有投入相关案例生产使用. flutter_chatroom项 ...

  6. windows 仍在设置此设备的类配置。 (代码 56)_谷歌发布Flutter Alpha:支持Windows

    老孟导读:Windows来了,Mac.Linux.Web还远吗? 本文翻译自https://medium.com/flutter/announcing-flutter-windows-alpha-33 ...

  7. flutter release 版本 调试_腾讯课堂Flutter工程实践系列——接入篇

    前言 课堂目前的技术栈是React Native + Hybird + Native,随着技术的演进多端融合的趋势越来越明显,而RN的弊端也突显出来,jsBridge性能不是最优,占用前端人力,定位问 ...

  8. github windows系统监控_谷歌发布Flutter Alpha:支持Windows

    老孟导读:Windows来了,Mac.Linux.Web还远吗? 本文翻译自https://medium.com/flutter/announcing-flutter-windows-alpha-33 ...

  9. 号码认证一键免密登录,让验证更简单!

    用户手机号码验证是目前无线APP在用户注册.登录时必不可少的一个环节,而开发者在用户手机号码验证的方式抉择上,短信验证码貌似永远是第一选择.除了方案成熟.提供短信验证码的通信服务商多.价格便宜之外,短 ...

最新文章

  1. 用java向mysql数据库中插入数据为空
  2. JAVA多线程Thread VS Runnable详解
  3. Concourse:可扩展的开源CI管道工具
  4. JavaScript事件详解-jQuery的事件实现(三)
  5. Swift傻傻分不清楚系列(十一)类和结构体
  6. Oracle VM Virtual Box的安装
  7. 开灯问题---------简单模拟
  8. asp.net页面中Menu控件下拉菜单被frame挡住和iframe自适应高度的解决办法
  9. 使用TinyPNG批量压缩图片
  10. Java 读取扫描枪
  11. 从零到一,美芽的技术实战
  12. Windows系统查看电脑系统信息(操作系统与版本、系统型号、处理器具体型号、BIOS版本、BIOS模式、主板信息等等)
  13. 微信小程序---简约音乐播放器
  14. 2014中国互联网安全大会
  15. VTCP QIO技术解析
  16. 嵌入式软件工程师笔试面试指南-网络编程
  17. 如何检测ip和端口是否连通
  18. 02-pandas数据分析库
  19. 飞信免费发短信API接口调用方式
  20. LM358与TL431验证

热门文章

  1. 成功解决:wandb.errors.UsageError: api_key not configured (no-tty). call wandb.login(key=[your_api_key])
  2. 《CSDN博客搬家》
  3. 时域采样与频域采样实验报告_使用网络分析仪进行时域分析
  4. 希腊复兴的奠基礼-纳瓦里诺海战
  5. vue点击元素自身之外触发事件指令
  6. Discuz插件提示:对不起,您安装的不是正版应用的解决办法
  7. 阿里正式启动2021届春季校招!2021Java不死我不倒,好文推荐
  8. CSS排版练习小作业,文字围绕图片显示,基本的float浮动定位
  9. BZOJ3521: [Poi2014]Salad Bar
  10. 【MSP430G2553】图形化开发笔记(5) UART 串口及printf