写点什么

Flutter 并不像你想象中的那么完美

  • 2019-08-07
  • 本文字数:3888 字

    阅读完需:约 13 分钟

Flutter并不像你想象中的那么完美

现在正是 Flutter 的盛行期,很多开发者都投入到它的学习阵列当中。本文介绍了下作者在应用 Flutter 开发项目时遇到的痛点和难点。


免责声明:我是一名 Android 开发者,我用 Kotlin 写的项目在 GitHub 拿了 1000 颗星,我很喜欢 Kotlin。我讨厌 Android、iOS 的 UI,但我很期待 Swift UI 和 Compose UI……终于来了。


是个原生 Android 开发者都会骂几句 Flutter,目前在 GitHub 上它足足有超过7千个未解决的问题,跟Adobe Flash一比就知道这是多吓人的数字了。但不管怎样,因为我之前在跨平台开发中吃了很多苦头,所以我还是决定学一学 Flutter,看看它能不能让我活得轻松一点。用户天天抱怨我的应用为什么不出 iOS 版本,而且 Flutter 很快就能支持 Web,我看我也没什么选择了。



类似这种事情有必要吗?


这篇文章不会谈什么有状态/无状态小部件或者一般性的话题。我要讲的东西你几乎见不到有人会提,比如上面的截图这种事情。为什么连修复错误都要悬赏啊?


作为背景知识,你应该知道以下三件事:


  • 他们用 GitHub 中的点赞数量来确定问题的优先级。

  • “许多”非常重要的问题需要数月(甚至数年)才能解决,这实在让人郁闷——而且会导致令人很不爽的状况,上面的截图就是例子。

  • 你经常需要依赖 star 好多的第三方库,也许哪天这些库就没人继续维护了,但你也没别的选择。Flutter 不像 Android 上的 Square 或谷歌的 Jetpack,前者对社区的依赖程度要高得多,你躲都躲不开的。我不是说我就不喜欢开源或各种库——我很喜欢它们!但我每天回家都会看到有好些很有用的 Flutter 库上次更新时间都是 4-10 个月之前了;我也搞不清到底是这些库停止开发了呢,还是说作者准备在下次 Dart 更新时再同步更新之类。

安装过程很漫长

我说得有点夸张了。安装很慢!但不像在没有 Conda 的 Linux 上配置 TensorFlow 那么难。多谢 Reddit 的提醒!我修改了下,下面是改过的版本:


我说得有点夸张了。安装很慢!但不像在没有 Conda 的 Linux 上配置 TensorFlow 那么难。多谢 Reddit 的提醒!我修改了下,下面是改过的版本:


曾经我以为踏入 Flutter 世界的第一步会非常简单。很可惜,我错了。你得下载一个 zip,把 PATH 导出到正确的位置(只能设置为当前的终端会话),然后调用 flutter 命令来安装所有内容。然后你还得再输一些命令来安装剩下的工具才能在 iOS 中运行 Flutter 应用,或者要下载 Android Studio 来开发 Android 应用。在 iOS 上你得用 homebrew 再装一些库才行。


我自己还是希望能在 homebrew 里输一条命令就安装好整个 Flutter,而且还有人为此开了一个问题(实际上这个问题受欢迎度都排到第四)。也能找到一些非官方脚本,有的很好用,也有的做得很差,但就算用了脚本也还是要手动做很多工作:你只能使用 flutter doctor 更新 Flutter,不能用 brew upgrade;想从稳定版升级到测试版基本上意味着要重装一遍,而且你还要搞清楚它装哪儿了,因为睿智的 Android Studio 会问你 Dart 编译器在哪里。最近的一项用户调查表明,“完善安装流程会带来更高的用户留存率”,所幸官方现在看起来很重视这个事情了。


好啦,那么终于安装完毕后我们可以开始学习 Flutter 了吧。结果大家才学了点最基本的操作就得自谋出路了——简直和学习 Android 开发一个德性。最后我花了些 dollar 参加了“基于 Dart 语言的 Flutter 开发完整流程训练营”,它还是“与谷歌 Flutter 团队合作建立的”(也可以在 Udemy 上购买),效果很好,我非常推荐。如果你上了这条船那就去学学吧,对新、老程序员都很有帮助。

一团糟的 Material Design

排版

我是 Material Design 的忠实粉丝,我知道 headline6、subtitle1、body1 等等的正确用法。Android 和 iOS 的 Material Design 组件都有官方指南,表现很正常。但是 Flutter 的 MD 简直了。Flutter 里可以选择用旧命名的旧样式(默认)或者用旧命名的新样式你敢信?假设你选了新样式,那么看起来你是在用 body1,实际上你用的是 body2(反之亦然)。如果你要的是 headline5,结果得用 display1 才行。完全就是一锅粥啊。



醒不来的噩梦

Bottom Sheet

我想用一个 Bottom Sheet 显示一个折叠视图,展开是个列表,向上滚动时又会折叠起来。这又不是什么稀罕物,谷歌地图之类的谷歌应用里都有这种东西。但就是做不到。Flutter 原生的 Bottom Sheet 功能太少,啥都干不了;非官方团队做的Bottom Sheet还好用些,但当列表位于顶部时,向下滚动页面它还是没法自己折叠起来。

图标

做一个图标好难!没有矢量绘图,没有 PDF 或 Lottie 支持(但有个连接 iOS Lottie 和 Android Lottie 的第三方库)。字体倒是有。你得把自定义图标打包到字体里。要么你只能用别人做的自定义图标打包的字体了。比如说 Flutter 的Feather图标包上次更新是 10 个月前或7个月前了,但人家本体上次更新是两个月前的事


如果你用的是 SVG(也需要第三方库,还好作者是谷歌员工),它会异步加载成一张图像。比起直接用图标来说你得多做一点细微的工作,而且有的地方可能只支持图标,不过大体来说还是没什么问题的。SVG 唯一困扰我的问题就是它的异步属性:我见过连一个小部件都比 SVG 更早加载的情况,所以输出的结果会很奇怪,本来啥都没有,duang 的一下都冒出来了。


至于字体来说,如果你想用在 2018 年更新的 Material Design 图标的话可就不走运了。标准图标倒是能用,但如果你需要新的图标(sharp/outline/等等),就只能单独下载它们并构建成一个字体,或者找找看是不是有人已经造了轮子,实在不行就单独下载下来用作 SVG。

文本输入

我在文本输入方面也遇到了一些问题,这方面的已知问题还一大堆(问题数量和其他组件差不多,但因为大多数应用都要用到文本输入,因此这类问题出现得更频繁,更烦人)。我最讨厌的一个问题是在特定情况下(经常出现)清除按钮用不了,如下所示。是的,这是个人问题,但由此可见多少细节都会出莫名其妙的错误,而且迟迟得不到解决。



点击X清除文本字段时出错。1个月前报告的问题。可稳定再现

其他烦心事

滚动监听器

我是 RecyclerView 的 addOnScrollListener 的重度用户,经常用在我的 Android 应用里。包括 Netflix 在内的许多应用都用它侦测用户的滚动操作,在页面滚动时隐藏键盘。但在 Flutter 上用它要花好大力气才行。当你使用 ListView 时列表会拦截拖动事件,因此手势回调什么都收不到。你可以监视列表的更改,但当列表更新/过滤/……时会被调用,所以这条路子走不通。你还可以用一个监听器监听手指触摸屏幕的动作,真的很低级。我为此还提了一个issue。此外还有个第三方库可以应付一部分人(特别是 iOS)的情况,但这就是另一回事了。


用户 filleduchaos 报告,PointerMoveEvents 可以提供 delta,因此当 GestureDetector 的 verticalDelta 不可用时可以用它对付一下,因为 Offset 既有垂直组件也有水平组件。点击此处查看相关信息。

滚动感知

滚动列表这么简单的行为也让人觉得“不对劲”,你会发现它和原生的就是不一样。也有人试图做些改进,甚至有一些集成测试对比二者;但即使在 Android 上——而且 Android 是开源的,你也能感受到它们之间的区别。我不是说滚起来一个快一个慢,我只是说它们滚起来不一样,差异肉眼可见。React 的滚动也不太一样,但它更接近原生的感觉。

页面预览

在 Flutter 中做轮播只有一种方法,而且错误百出——而所有第三方库都只是打个包而已。如果你滚动得“太多”,它会跳过一个元素。你没法自定义,没法做出类似谷歌 Play 游戏中心那样的效果,因为它根本做不到。这里我也有一个未解决问题。可惜我恐怕要等好久了,因为去年 11 月的一个错误今年 6 月才刚修复

状态

这个问题影响太重大了,甚至应该专门写一篇文章来批判。其中 Square 发布的这个问题就让我很郁闷,同时也告诉大家不了解 Android 或 iOS 的话可不要一头扎进 Flutter 里去。需要的平台还没搭好,到最后你还得处理别的问题。缺少 onSaveInstance 和其他一些东西也让人很痛苦。是的,这些东西在不同平台上的行为不一样,甚至在 Android 上总是在变化,但我还是希望 Flutter 将来能搞定一部分内容。

视图缩放

现在 Flutter 要支持 Web 端了,我真好奇他们要怎么解决这个问题:


总结

看看社区,再看看第三方库,看起来相比 Android 来说 Flutter 跟 Javascript 走得更近。但 JS 正在一路狂奔,Flutter 还在原地徘徊,不知道下一步该往哪里走。宁可造成混乱也要保持兼容性?没错。一大堆水平堪忧的库刚面世就停止开发?就是这样。我很想爱 Flutter,但现在的 Flutter 不爱我啊。也许他们缺少人手,需要大幅扩张团队?也许他们只需要好好整顿一下,理清思路找出重点?问题究竟在哪儿只有他们自己才知道。


我还是会继续研究 Flutter,希望能用它开发一两个应用。用 Flutter 做 UI 还是很愉快的,虽说 Dart 还是有些不够用——而且我还没提依赖注入之类的高级玩意儿。就算发布应用不是什么轻松的工作,他们也花了差不多一年时间才做出来 32 位和 64 位的 APK。但愿他们别把心思都放在 Web 支持上吧,否则未解决问题很快就会堆到 1 万个以上了。


这篇文章的本意不是说“Flutter 问题多多,因此我讨厌它,它快死掉吧!”。本文的主题应该是“Flutter 并不完美,痛点显而易见而且越来越多,但如果他们多下点心思的话是能做出宣传的效果的”。我们过去很多年都在忍受 Android 上的一大堆缺陷,所以现在容忍 Flutter 没什么问题。但我真的希望它能比现在这慢吞吞的样子跑得再快些。



我阅读一个库的源代码时偶然发现的注释(来源


英文原文:https://medium.com/@bernaferrari/from-android-dev-flutter-looks-good-but-is-painful-here-are-my-frustrations-with-it-81b4bbe739f8


2019-08-07 08:006545

评论 3 条评论

发布
用户头像
安装过程很漫长 这个标题下面是不是重复了?
2019-11-08 15:08
回复
用户头像
翻译可以呀
2019-10-31 17:49
回复
用户头像
翻译过于接地气
2019-08-08 01:19
回复
没有更多了
发现更多内容

怎样才能让业财融合真正为企业数智化转型起到推动作用?

用友BIP

财务共享

Kyligence x 明道云|低代码平台助力中小企业实现存量背景下的创新增长

Kyligence

数据分析 低代码平台 指标平台

利用跨端框架和小程序容器技术,打造一致体验的多平台应用

FinFish

小程序 小程序容器 跨端框架 小程序化

万众瞩目的Nautilus Chain即将上线主网,生态正式起航

大瞿科技

利用透明压缩技术解决企业级SSD读写延迟挑战

ScaleFlux

压缩算法 固态硬盘 企业存储

AI浪潮再掀低代码开发热,快来了解最新趋势!

加入高科技仿生人

人工智能 低代码 AI技术

Last Week in Milvus

Zilliz

非结构化数据 Milvus Zilliz 向量数据库

拿到字节跳动奖学金,入职字节跳动做科研,他们经历了什么?

字节跳动技术范儿

字节跳动 语音合成 模型压缩

RocketMQ 多级存储设计与实现

阿里巴巴云原生

阿里云 RocketMQ 云原生

财务共享五大价值助力央企构建世界一流财务管理体系

用友BIP

财务共享

水泥行业全球第一企业怎么进行财务共享建设?

用友BIP

财务共享

AIGC下的低代码赛道,你我皆是拓荒人

引迈信息

AI 低代码 AIGC JNPF

项目很大,是否忍一下?

巨梦科技

微前端

点云标注技术推动该领域的发展

来自四九城儿

进阶神册!Redis+Nginx+设计模式+Spring全家桶+Dubbo核心技术笔记

程序知音

Java 数据库 spring java架构 Java进阶

软件测试/测试开发丨Web自动化测试高级定位xpath

测试人

程序员 软件测试 自动化测试 测试开发

多元办公场景下,企业如何保障工作效率与数据安全流通?

人称T客

LangChain 查询使用指「北」

Zilliz

Milvus AIGC 向量数据库 zillizcloud langchain

开源大模型新SOTA!支持免费商用,比LLaMA65B小但更强,基于1万亿token

Openlab_cosmoplat

开源社区 falcon

云服务器与独立服务器的性能比较:您需要了解的关键差异

一只扑棱蛾子

云服务器 独立服务器 服务器性能

数字化转型应该如何去做?(过程管理方法篇)

数字随行

数字化转型

inBuilder今日分享丨表单设计器画布渲染引擎揭秘

inBuilder低代码平台

怎样将图片直接转换为3d模型?

真大的脸盆

Mac Mac 软件 图片转换工具 图片转换模型软件

通过SQL获取每个月第n周任意天的数据

搞大屏的小北

sql查询 sql 第一周 每个月 周一

数据可视化:分布类可视化图表大全

2D3D前端可视化开发

大数据 数据分析 数字化转型 数据可视化 数据可视化工具

论数字化大趋势下,建设财务共享中心的重要性

用友BIP

财务共享

西南财经大学李玉周:数智化技术广泛使用推动管理会计加快落地

用友BIP

智能会计 价值财务

Wallys/DR5018+QCN6122/support for the latest Wi-Fi standards in networking devices.

Cindy-wallys

ipq5018 QCN6102 QCN6122

踢碎破局陷阱,来一场酣畅淋漓的 SLG!

网易智企

AI AIGC

GreptimeDB 使用指南|快速查询分析外部数据

Greptime 格睿科技

数据库 分布式 云原生 时序数据库 使用指南

MobTech MobLink|小程序、网页跳转App的原理

MobTech袤博科技

Flutter并不像你想象中的那么完美_语言 & 开发_Bernardo Ferrari_InfoQ精选文章