title: 让我们在2019年重新认识 Flutter layout: keynote thread: 210 date: 2019-01-17 author: Joe Jiang categories: Presentation tags: [2019, Flutter, 移动开发, Dart, 跨平台技术, 前端] excerpt: 现在是2019年,让我们认真来看看备受瞩目的 Flutter,重新认识一下它。本文首先简要回顾移动开发(跨平台开发)的发展历史,并谈谈不同阶段跨平台解决方案的优劣;接着从 WHAT / HOW / WHY 三个方面详细来聊聊 Flutter,并结合简单的 Dart 代码说说开发者该如何上手,随后展示几个 Demo App;最后会就本次分享进行一段小结。Flutter 到底是什么,它的来临对前端又意味着什么?
现在是2019年,让我们认真来看看备受瞩目的 Flutter,重新认识一下它。本文首先简要回顾移动开发(跨平台开发)的发展历史,并谈谈不同阶段跨平台解决方案的优劣;接着从 WHAT / HOW / WHY 三个方面详细来聊聊 Flutter,并结合简单的 Dart 代码说说开发者该如何上手,随后展示几个 Demo App;最后会就本次分享进行一段小结。Flutter 到底是什么,它的来临对前端又意味着什么?让我们接着往下看。
当下的移动互联网仿佛给我们营造一种假象—— Android 和 iOS 已经存在许多年。而回首过往,才发现 Android 刚和我们度过第一个十年。十年前我们更多的讨论桌面应用与 Web,十年后我们专注在一个小屏幕,享受移动应用给我们带来的多彩世界。
移动应用(即我们日常所说的「原生」应用程序),通常是指某一移动平台所特有的应用程序。通过使用特定平台所支持的开发工具和语言进行开发,你可以直接调用系统提供的一些 SDK API。当下流行的移动操作系统中,我们使用 Java 或 Kotlin 调用 Android SDK 开发 Android 应用,或通过 Objective-C 或 Swift 调用 iOS SDK 开发可以上架 App Store 的应用。凡事没有银弹,移动开发也是如此。简要来看,原生应用开发具有以下优势:
而其缺点也很明显,主要有:
说到动态化,一次编码便可运行在任何平台的 Web 让我们记忆深刻。而针对移动端存在的这些问题,为了在提高体验的同时赋予应用动态化能力,诞生了一批又一批的跨平台移动开发解决方案。根据实现方式的不同,我将它划分为三个时代:
我们常说 Web 最终将一统天下,也常听见 Web 在离我们远去的声音。但至今在终端 UI 上也没有迎来一个完美的解决方案,这是因为在不同阶段、不同实现上,都存在很多现实问题。让我们再回顾一下这三个时代:
注:「累赘」问题可详见 Flutter 中文网关于移动开发技术一章的介绍。
其他还有一些问题值得思考,比如:
带着这些疑问,我们走进全文的主角——Flutter。从2017年第一个 Alpha 版到上个月 Flutter Live 发布的 1.0 版本,Flutter 正获得越来越多的关注目光。很多听到这个词的同学可能会感慨,似乎 UI 技术迎来了终极解决方案。我们先看看官方对它的定义:
Flutter 是 Google 用以帮助开发者在 iOS 和 Android 两个平台开发高质量原生 UI 的移动 SDK。Flutter 兼容现有的代码,免费并且开源,在全球开发者中广泛被使用。
看看 Flutter GitHub Star 的变化趋势,会发现每一个陡增都预示着 Flutter 的一次重要版本发布。在深入了解之前,我们来看几个用 Flutter 做的 App,感受下官方所述的 Beautiful 到底是什么样子的。
看上去好像还不错,但 Flutter 究竟有哪些与众不同呢?我们按照官方描述的四个方面,分别来说说:
注:数据源自 Flutter 还有4116个Issue,是否成熟?
为什么要使用 Flutter?仅仅因为他是「Google 下一代操作系统」Fuchsia OS 的内置 UI SDK 么?
让我们看的再详细一些,上一张 Flutter 系统架构图,根据之前在问题「开发跨平台app推荐React Native还是flutter?」下的回答,我尝试简单解读一下:
从上至下分别为 Framework,Engine 和 EmEmbedder:
有没有对 Flutter 更清晰一些?
如果说再举一点可以打动你使用 Flutter 的地方,那就是 animation 了。利用 Flare 你可以轻松构建支持 Flutter 的动画效果。这有点像十年前用 Flash 做关键帧动画的感觉。
当然,Flutter 和 Dart 团队的不断努力和优化更是说服你选择 Flutter 的理由之一。在刚不久前结束的 D2 上,Google 工程师介绍了为什么 Flutter 可以如此快,比如 Dart 在运行时更少的 malloc,Flutter 应用运行时有更少的处理环节(跳过 Android/Chromium),Flutter 在渲染布局上更高效的遍历过程等等。
面向未来,让你在 Flutter 上下注的因素更少不了 HummingBird 和 Flutter for Desktop。STAY TUNED FOR GOOGLE I/O 2019!
利用 Flutter 提供的脚手架,做一个简单的 Demo 你甚至只需要写更改两个文件:main.dart 和 pubspec.yaml。作为前端,你可以将它们比做 index.js 与 package.json 吧。详尽的代码可见 https://gist.github.com/hijiangtao/2b58ab07d3d7ed96aa0f868140c906e5.
人的记忆是短暂的,说了这么多,如果说本文想给大家带去些什么思考的话,我觉得可以总结成下面五句话:
大浪淘沙,下一个十年我们又将身在何方?希望我的分享能让你有所收获。文中有误的地方欢迎评论指出,关于 Flutter 的更多内容欢迎一起讨论。谢谢。
背后的故事1:很多前端工程师在最初听到 Flutter 时都充满疑惑,为什么 Flutter 选用了 Dart,而不是使用 Web 技术或者是 JavaScript 语言来实现 Flutter 框架。其实 Flutter 中有不少内容便是吸收自 Web 社区,比如 tree shaking 和 hot reload。但 Flutter 另一个鲜为人知的故事是团队中大部分成员都具有 Web (Chromium) 背景。如果你看过 Flutter Live,应该知道 Flutter 与 Dart 团队的人数并不多,大致就头像墙中列出的那些,在最初设计上,他们也曾反复考虑 Web 技术,而在语言选型上也考虑过 JavaScript。应该不会有人比他们更了解 JavaScript 与 Web 了吧,但你看看这些开发过 Chromium 的人最后还是放弃了 JavaScript,我们有理由相信他们是经过深思熟虑后做出的决定。按照 Google 工程师的话来说就是「我们关注包括 Web 技术在内的很多技术,我们取其精华并勇敢地扔掉历史包袱。」
背后的故事2:在去年一年中,我们听到的 Flutter 声音更多是源自客户端开发者,但自 1.0 发布后,吸引到了来自前端同学越来越多的关注。这一点和嘤嘤在「2019 前端技术规划该包含什么?」中回答提到的现象类似。但前端同学有没有想过,Flutter 起源于移动端,现有 Flutter 虽然来自曾经 Chromium 团队,但整体对客户端开发的友好度是要高于前端开发的,毕竟有一个平台层插件摆在那里,再看看 Flutter 即将推出的 HummingBird,乍一看是 Web 的福音,但这也只是为 Flutter to Web 提供了途径,而非为前端提供了增强 Web 的可能。从某种意义上说,Web 的疆土正在逐渐缩小。这一次,我们是否真的要失业了呢?
注:关于 Google 工程师的一段话描述意译自 Google 工程师在 Flutter 圆桌会上的相关言论,有出入。