你好,我是陈航,目前在美团外卖担任商家业务大前端团队技术负责人。在接下来三个月的时间里,我将和你一起学习 Flutter。
当下是移动互联网的时代,也是大前端技术紧密整合的时代。而移动系统与终端设备的碎片化,让我们一直头痛于在不同平台上开发和维护同一个产品的成本问题:使用原生方式来开发 App,不仅要求分别针对 iOS 和 Android 平台,使用不同的语言实现同样的产品功能,还要对不同的终端设备和不同的操作系统进行功能适配,并承担由此带来的测试维护升级工作。
这对中小型团队而言无疑是非常大的负担,也无形中拖慢了追求“小步快跑”,以快速应对市场变化的互联网产品交付节奏。
为解决这一问题,各类打着“一套代码,多端运行”口号的跨平台开发方案,如雨后春笋般涌现,React Native 就是其中的典型代表。
React Native 希望开发者能够在性能、展示、交互能力和迭代交付效率之间做到平衡。它在 Web 容器方案的基础上,优化了加载、解析和渲染这三大过程,以相对简单的方式支持了构建移动端页面必要的 Web 标准,保证了便捷的前端开发体验;并且在保留基本渲染能力的基础上,用原生自带的 UI 组件实现代替了核心的渲染引擎,从而保证了良好的渲染性能。
但是,由于 React Native 的技术方案所限,使用原生控件承载界面渲染,在牺牲了部分 Web 标准灵活性的同时,固然解决了不少性能问题,但也引入了新的问题:除开通过 JavaScript 虚拟机进行原生接口的调用,而带来的通信低效不谈,由于框架本身不负责渲染,而是由原生代理,因此我们还需要面对大量平台相关的逻辑。
而随着系统版本和 API 的变化,我们还需要处理不同平台的原生控件渲染能力上的差异,修复各类怪异的 Bug,甚至还需要在原生系统上打各类补丁。
这都使 React Native 的跨平台特性被大打折扣:要用好 React Native,除了掌握这个框架外,开发者还必须同时熟悉 iOS 和 Android 系统。这,无疑给开发者提出了更多挑战,也是很多开发者们对 React Native 又爱又恨的原因。在这其中,也有一些团队决定放弃 React Native 回归原生开发,Airbnb 就是一个例子。
备注:2018 年,Airbnb 团队在 Medium 上发布的一系列文章(React Native at Airbnb、React Native at Airbnb: The Technology、Building a Cross-Platform Mobile Team、Sunsetting React Native、What’s Next for Mobile at Airbnb)详细描述了这个过程。
而我们本次课程的主角 Flutter,则完全不同于 React Native。
它开辟了全新的思路,提供了一整套从底层渲染逻辑到上层开发语言的完整解决方案:视图渲染完全闭环在其框架内部,不依赖于底层操作系统提供的任何组件,从根本上保证了视图渲染在 Android 和 iOS 上的高度一致性;Flutter 的开发语言 Dart,是 Google 专门为(大)前端开发量身打造的专属语言,借助于先进的工具链和编译器,成为了少数同时支持 JIT 和 AOT 的语言之一,开发期调试效率高,发布期运行速度快、执行性能好,在代码执行效率上可以媲美原生 App。而这与 React Native 所用的只能解释执行的 JavaScript,又拉开了性能差距。
正是因为这些革命性的特点,Flutter 在正式版发布半年多的时间里,在 GitHub 上的 Star 就已经超过了 68,000,与已经发布 4 年多的、拥有 78,000 Star 的同行业领头羊 React Native 的差距非常小。同时,阿里闲鱼、今日头条等知名商用案例的加持,更使得 Flutter 的热度不断攀升。
现在看来,在 Google 的强力带动下,Flutter 极有可能成为跨平台开发领域的终极解决方案。在过去的大半年时间里,我曾面试了 20 多位初、中、高级候选人,包括前端、Android、iOS 的开发者。当问到最近想学习什么新技术时,超过 80% 的候选人告诉我,他会学习或正在学习 Flutter。
不过坦白讲,相比其他跨平台技术,Flutter 的学习成本相对较高。我听过很多(大)前端开发者反馈:Flutter 从语言到开发框架都是全新的,技术栈的积累也要从头开始,学不动了。
学习成本高,这也是目前大多数开发者犹豫是否要跟进这个框架的最重要原因。对此,我感同身受。
但其实,大前端各个方向的工作有很多相似、相通之处。面对业务侧日益增多的需求,作为大前端团队的负责人,我曾在不同时期带领团队分别探索并大规模落地了以 React Native 和 Flutter 为代表的跨平台方案,也是美团最早落地 Flutter 线上大规模应用的发起者和推动者之一。
在探索并大规模落地 Flutter 的过程中,我阅读过大量关于 Flutter 的教程和技术博客,但我发现很多文章的学习门槛都比较高,而且过于重视应用层 API 各个参数的介绍或实现细节,导致很多从其他平台转来的开发者无从下手,只能依葫芦画瓢,却不知道为什么要“画瓢”,无法与自身的经验串联进而形成知识体系。这,无疑又增加了学习门槛,加长了学习周期。
那么,Flutter 到底该怎么学?真的要从头开始么?
虽然 Flutter 是全新的跨平台技术,但其背后的框架原理和底层设计思想,无论是底层渲染机制与事件处理方式,还是组件化解耦思路,亦或是工程化整体方法等,与原生 Android/iOS 开发并没有本质区别,甚至还从 React Native 那里吸收了不少优秀的设计理念。就连 Flutter 所采用的 Dart 语言,关于信息表达和处理的方式,也有诸多其他优秀编程语言的影子。
因此,从本质上看,Flutter 并没有开创新的概念。这也就意味着,如果我们在学习 Flutter 时,能够深入进去搞懂它的原理、设计思路和通用理念,并与过往的开发经验相结合,建立起属于自己的知识体系抽象层次,而不是仅停留在应用层 API 的使用上,就摆脱了经验与平台的强绑定。
这样的话,即使未来老框架不断更新,或者出现新的解决方案,我们仍旧可以立于不败之地。
那么,Flutter 框架底层有哪些关键技术?它们是如何高效运转,以支撑起可以媲美原生应用的跨平台方案的?Flutter 应用开发的最佳实践是怎样的?企业需要什么样的终端技术人才?终端技术未来有哪些发展方向?
这些问题,正是我要通过这个课程为你解答的。在这个课程里,我不仅会帮助你快速上手,能够使用 Flutter 开发一款企业级 App,更希望帮助你将其与过往的开发经验串联起来,以建立起自己的知识体系;同时,希望你能透过现象明白 Flutter 框架的用法,并看到其背后的原理和设计理念。
为了帮助你领悟到 Flutter 的核心思想和关键技术,而不是陷入组件的 API 细节难以自拔,我会在不影响学习、理解的情况下,省去一些不影响核心功能的代码和参数讲解,着重为你剖析框架的核心知识点和背后原理,并与你分享一些常见问题的解决思路。
整体来说,专栏主要包括以下五大部分内容:
- Flutter 开发起步模块。我会从跨平台方案发展历史出发,与你介绍 Flutter 的诞生背景、基本原理,并带你体验一下 Flutter 代码是如何在原生系统上运行的。
- Dart 基础模块。我会从 Dart 与其他编程语言的设计思想对比出发,与你讲述 Dart 设计的关键思路以及独有特性,并通过一个综合案例带你去实践一下。
- Flutter 基础模块。我将通过 Flutter 与原生系统对应概念对比,与你讲述 Flutter 独有的概念和框架设计思路。学完这个模块,你就可以开发出一个简单的 App 了。
- Flutter 进阶模块。我会与你讲述 Flutter 开发中的一些疑难问题、高级特性及其背后原理,帮助你在遇到问题时化被动为主动。
- Flutter 综合应用模块。我将和你聊聊在企业级应用迭代的生命周期中,如何从效率和质量这两个维度出发,构建自己的 Flutter 开发体系。
最后,我希望通过这个课程,能够帮助你快速上手 Flutter 开发应用,掌握其精髓,并引导你建立起属于自己的终端知识体系。
现在,Flutter 正处于快速发展中,社区也非常活跃。站在未来看未来,尽管 Flutter 全平台制霸的目标已经非常清晰,但为期三个月的专栏分享未必能穷尽 Flutter 未来可能的技术发展方向。接下来,我会持续关注 Flutter 包括移动端之外的最新变化,持续更新这个专栏,第一时间与你分享 Flutter 的那些事儿。
好了,今天的内容就到这里了。如果可以的话,还请你在留言区中做个自我介绍,和我聊聊你目前的工作、学习情况,以及你在学习或者使用 Flutter 时遇到的问题,这样我们可以彼此了解,也方便我在后面针对性地给你讲解。
加油,让我们突破自己的瓶颈,保持学习、保持冷静、保持成长。

COMMUNITY NOTES
读者评论
老师你好,我之前接触过flutter,但是放弃了。因为接触了flutter之后发现,渲染UI方面确实性能、简洁性各方面都不错、可是像webView、音视频播放、第三方分享、数据持久化存储等功能需要大量的组件支持,flutter引擎并不支持。因此就需要去编写大量的组件、但是编写组件很麻烦、等于要写三套代码:iOS代码、安卓代码、Dart代码,那如果这么麻烦的话flutter存在的意义又是什么呢?这就是我放弃的原因。所以老师能讨论下这个问题该怎么解决吗?
我是工作两年的后端,半年前内部调岗到大数据,,不过我的全栈梦想和架构梦想一直没变过,
我是一位后端开发者,请问没有前端经验开始学习flutter是否吃力,能独立开发一个应用周期会有多久?
我是做iOS开发的,Flutter是我接触的第一个跨平台开发框架,自学一段时间后,遇到了如下一些问题:1.网页加载问题。2.视频播放问题。3.原生和Flutter之间跳转问题。4.图片编辑问题。5.Platform View目前还是beta版,也有各种问题。6.网络请求代理的问题。7.等等吧。希望在这个专栏中能够得到解答。
我是一个7年老前端了,打算从flutter入手切入客户端开发
后端程序员适合学习吗
我是工作两年的Android程序员,赶上了Android移动端的末班车,希望通过学习Flutter可以弯道超车,实现自己的小梦想!加油!小伙伴们!
我做过几年Android/IOS应用程序开发,也使用Weex写过公司项目,不过这些东西快一年没接触了,现在一直在写后端(Java、.Net)跟Web前端,Flutter没发布正式版的时候自己也根据文档学过一些皮毛,就是学了基础控件然后做了一些商城首页、列表、详情示例,后来因为工作原因暂时把它放下了。现在,总有放不下Flutter的那种感觉,感觉它会火,它是前端跨平台的一个趋势,所以又冒出了继续学习Flutter的想法,前几天自己也通过写博客分享了Flutter环境安装在Java11下遇到一些问题的解决方法。现在真的很忙,每天半夜才能睡觉,不想自己去翻文档、看博客学习了,这样太累,想利用睡觉前刷头条的时间学习一下Flutter,技多不压身,所以希望能够通过老师分享的这个课程系统的深入的学习Flutter,快速入门Flutter。
老师好,我从实习到现在接触前端两年,最近准备学习flutter!目前接触的移动端解决方案是h5页面嵌在原生壳里面,这样做开发过程中和原生会有很多交互,不方便开发!1、需要android和iOS各自打包壳2、iOS上架审核慢问题3、第三方视频sdk集成问题,需要写两套,前端再调用原生方法打开视频4、实时位置定位等问题希望这些问题可以得到老师的解答!学习flutter image.network 加载网络图片失败了,还没找到原因
评论区好多后端 学 flutter的 … …我也是,
大佬问一下,为什么我觉得只要我flex用的好,其实像移动端前端都差不多,于是有几个问题(1)你即使用flutter也会有不同系统会有差异的问题,那我为什么要用flutter?他和市面上的这些前端框架有什么差别和优势,很多框架也支持多平台,而且学习曲线再高,也不过是JS+HTML+CSS的基础上DOM上搞事情。(2)还有这个flutter社区会真的流行开来吗,社区活跃度你觉得怎么样比如说跟一些比较流行的比?
我对dart能否成为大众开发语言持怀疑态度。我更认为typescript是未来前端的主流开发语言。
前端开发一枚,熟悉webpack、react。老师有这些js基础学习Flutter会容易一些吗?
Flutter仅仅只是解决跨平台的问题吗?感觉在一些工具类项目(内部办公类似钉钉)中使用场景并不多,反而美团外卖中有很多Web页面很有必要这么做。
PHP开发,乐于接触新的技术
目前用Flutter构建了一个应用,但是在:1.多环境(Dev、Uat、Pro)变量管理;2.状态管理;没有找到较好的实践。老师,在专栏里面会对这些进行分享吗?
我也打算好好学习一下flutter,但是作为多年的后端开发人员,学习起来好吃力,懵圈中!
有前端经验,了解些flutter。有个请求,老师出课程能尽量快点,不一定非要按目录来, 深入的知识后面再单独讲也行。 thanks~~~
你好老师,作为一个创业团队技术负责人,深感原生开发对于我们这样的团队有多痛苦加上人员因素,关注flutter好久了,作为ui层框架我觉得是我们团队需要的,可是由于应用的特殊性,有ar和人工智能算法类需求,对摄像头的调用和应用所以必须有native的存在,可否在专栏中讲解并存的方式,将flutter和ios或者android原生混合或者这方面成熟的案例,因为我们算法团队和ar本身就是和应用开发是分开的人员开发的,哪只要可以统一ui开发就好了
题图里的 MacBook Air 竟然装的是 Windows 系统!🤭