热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一、初识Flutter

文章目录Flutter是什么跨平台开发Fuchsia移动端开发历程第一阶段:原生开发第二阶段:H5第三阶段:跨平台框架(RN)FlutterFlutter架构Flutter发展史F

文章目录

    • Flutter是什么
    • 跨平台开发
      • Fuchsia
    • 移动端开发历程
      • 第一阶段:原生开发
      • 第二阶段:H5
      • 第三阶段:跨平台框架(RN)
      • Flutter
    • Flutter架构
    • Flutter发展史
    • Flutter特点和优势
      • 特点
      • 优势
      • Showcase
    • Dart
      • Dart特点
      • JIT 和 AOT
    • 总结

Flutter是什么

官方文档介绍:Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的。

跨平台开发

在官方介绍中我们可以知道它是一款跨平台移动UI框架。

在传统的原生开发中,一般都要维护Android、iOS两个开发团队,版本迭代时,无论人力成本,还是测试成本都会变大。这一点可能对于我们普通的android程序员感受并不深,或者说我们不care这一点。但是站在公司的角度上,如果能够有一套代码,直接就能够开发出android的apk和ios的ipa,是不是意味着我只需要拥有开发维护这套代码的一个团队就可以了?从人力成本上来说,可以让我少发一些工资。而在开发的角度,一套代码也能够很好的完成复用、测试以及UI风格的统一。而Flutter正是这样一个能够让我们跨平台开发的框架。

移动端跨平台,一般指的就是Android与IOS两大平台。值得我们讨论的是除了Android、IOS之外Flutter它还是一个叫做**“Fuchsia”**的操作系统主要的UI开发框架。

Fuchsia

Fuchsia是Google开发的继Android和Chrome OS之后的第三个系统。外界都在猜测它会取代Android,但是也只是猜测而已。Fuchsia OS是完全基于Flutter SDK和Dart语言来进行开发的。关于更多Fuchsia OS的介绍,请看这篇文章:

https://www.leiphone.com/news/201807/PvIhKxdQPLTT87c2.html

移动端开发历程

2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。2011年,移动互联网各种应用开始普及,用户习惯慢慢养成。从2011年到如今,移动互联网实实在在的影响着我们日常生活中的点点滴滴。在互联网草莽兴起的年代,只要能用Android提供的SDK完成一个简单界面的编写就能找到一份不错的工作。但是移动互联网慢慢进入下半场,已经没有了高速发展期的红利,在如今我们移动互联网从业人员更应该从各个方面不断强化自己的技能。

第一阶段:原生开发

在早期的移动开发中,面对这个崭新的方向,人们都处于摸索节点,那时候大家都在进行原生的开发。但是谁都不想放过移动互联网这块蛋糕。Web开发人员的数量远远多于移动互联网开发人员,同时由于原生开发的成本与动态化渐渐无法满足要求。同时原生开发维护成本大、开发周期长,动态化能力弱,所以人们都在寻找跨平台的方案,希望能够只需要一个团队维护一份代码,就能够完成Android与IOS的开发需求。

第二阶段:H5

早在2008年,就有一款叫做**“PhoneGap”的框架获了奖并开始支持Android平台。现在我们说的PhoneGap一般指的是"Cordova"。它是PhoneGap贡献给Apache后的开源项目,是从PhoneGap中抽离出的核心代码,是驱动PhoneGap的核心引擎。两者维护的是共同的一份源代码组件,只有名字和包名不一样。PhoneGap是一个采用HTML,CSS和Javascript来完成跨平台开发的技术,当时PhoneGap宣称接近原生性能。然而它的工作原理是基于WebView,然后利用JavaInterface来完成与原生代码的交互。我们称这种工具为WebView Javascript Bridge(JsBridge)**。这种方式,能够很好的解决跨平台与动态更新的需求但是,我们都知道android WebView的渲染效率很差,同时Javascript是解释型语言,它不需要编译,在运行时候解释执行,这就导致Javascript的执行性能太低了。同时因为android自身的问题,使用WebView过程中消耗的内存,没有办法在不需要使用的时候进行及时的回收,这样会导致我们的可用内存越来越少,最终OOM。

一、初识Flutter

上图为Cordova工作原理,app直接使用webview加载js进行页面的渲染与交互,可以通过一个JSBridge来调起原生的一些服务(相机、蓝牙、传感器等)。

第三阶段:跨平台框架(RN)

为了突破使用WebView进行渲染的性能问题,2015年4月,Facebook开源了JS框架 React 在原生移动应用平台的衍生产物——React Native。RN将渲染交给原生,而不是直接在HTML中完成。

RN依旧是基于Javascript代码。这时候,我们使用JS写好UI后,会组成一个Virtual DOM。然后通过Bridge将VD发给原生层去进行UI的创建。这种方式看起来与原生开发非常相似,我们在进行原生开发的时候,写好XML布局再由Java对这个布局XML进行解析,然后通过反射创建对应的View,这个XML就是一个界面的配置文件。而使用RN,我们的配置则由XML变成了JS编写。不同的是我们在原生开发中,xml是静态的配置,而RN中要更新UI,又需要经历一次Bridge传递的过程。同时如果需要在RN中调用原生API也需要通过bridge来进行传递。
这样导致需要频繁的跨桥调用,bridge 的成本太高了。

虽然RN底层是使用原生进行绘制,但是毕竟中间多了一层Bridge,也就是多了一层中介,你租房是希望能直接与房东进行交流还是和中介公司?很显然,去中介公司进行租房,你将花费一些代价。所以RN多了一层中介——Bridge,它绝无可能与原生的性能相媲美,但是为了跨平台,这点代价不是致命的。

一、初识Flutter

RN所有的交互操作都是使用js来完成,最终在编译的时候由创建原生相应的组件来完成渲染。这样便不再需要webview来进行交互。

Flutter

因为RN与原生之间是需要一个Bridge作为中介者来进行交互的,这样性能必然会有影响。为了解决这个问题,于是Flutter应运而生。
一、初识Flutter

Flutter的工作机制和我们预想的一样,他正是通过将它的代码根据不同的平台编译为对应平台的机器码,这样就不需要Bridge的存在了。Flutter自己嵌入了一个 Dart VM,我们编写的代码会被编译成ARM的机器码,在Android中就是通过Dart VM所在的libflutter.so完成我们自己编写的代码生成的机器码的载入执行。

Flutter架构

一、初识Flutter

Flutter框架整体拥有两层架构,由上往下,第一层是Framework类库层,提供给我们在开发时所使用的各种Widget、动画等。而第二层则是Engine引擎层,我们上面所说的Dart VM也就处于这一层。

Flutter发展史

一、初识Flutter

  • 2 月底在世界移动大会 (MWC) 上发布首个 Beta 版;

  • 5 月的 Google I/O 大会上发布 Beta 3 ;

  • 6 月的 全球移动技术大会GMTC 发布首个预览版;

  • 9 月的 Google开发者大会GDD,发布预览版 2;

  • 12 月 Flutter Live 2018 ,发布1.0 稳定版。

Flutter特点和优势

特点

  • 快速开发
  • 富有表现力,美观统一的用户页面
  • 本地性能表现良好

优势

  • 热重载

    页面每次改动,不需要手动去刷新,可自动刷新。即支持开发过程中热重载。

  • 统一的UI

    Flutter 提供丰富的内置 UI 组件—— Material Design(针对 Android )和 Cupertino(适用于 iOS ),不需要担心在众多设备上看起来会有什么不同。

    与原生性能对比

    与Rn性能对比

Showcase

Flutter官网也列举了一些一线互联网公司的产品

showcase

Dart

我们都知道,与其他跨平台框架使用JS作为开发语言不同的是,Flutter使用的是Dart。

为什么使用Dart?,官网也做了详细的介绍

为什么选择dart?

Dart特点

  • 基于JIT的快速开发周期

    Flutter再开发阶段采用了JIT(及时编译),这样就避免了每次改动都要重新进行编译,极大的节省了开发时间。

  • 基于AOT的发布包

    Flutter在发布时可以通过AOT生成高效的ARM代码以保证应用性能。

  • 单线程

    不需要锁,dart不存在数据竞争和变量状态同步,也没有线程上下文切换的性能损耗和锁导致的卡顿。至于为什么dart是单线程的,可以 参考美团技术团队的这篇文章:

    https://mp.weixin.qq.com/s/cJjKZCqc8UuzvEtxK1BJCw

  • 垃圾回收

    多生代无锁垃圾回收器,专门为UI框架种常见的大量的Widgets对象创建和销毁进行优化。

JIT 和 AOT

  • JIT (Just In Time Compiler), 及时编译技术。

    ​ Dalvik虚拟机就是采用的这种技术。由虚拟机执行,虚拟机第一次运行某一段代码的过程中,就会对这段代码进行编译,生成原生的机器码,这样在下次执行的时候,直接执行机器码,速度更快。Dart虚拟机的及时编译就是基于热重载技术,在每一次改动代码后及时进行编译并运行。

  • AOT(Ahead Of Time)

    ​ android 5.0以后出现了art虚拟机,放弃了JIT及时编译技术,采用了AOT。而Dart也是采用了AOT的技术,在程序安装的时候,将字节码编译成机器码,这样在运行时就不再需要编译,速度更快。

总结

你觉得Flutter前景怎么样?为什么你会选择使用Flutter?

与其他混合开发相比,Flutter使用了自己的虚拟机,使用及时编译技术提高我们的开发效率,使用AOT提升了程序的运行速度。并且它和dvm一样,有自己的渲染引擎。性能上要比Cordova和RN好很多。Flutter也可以统一我们应用的UI,不会再出现两端不一致的问题。其次很多一线互联网大厂都在使用Flutter,Flutter也日渐成熟,这已经成为了一种趋势,我们有必要考虑在自己的项目中来尝试使用它。

(如果面试问到,这并不是唯一答案,请同学们根据自己的理解自行组织语言)


推荐阅读
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • Flutter 开发中集成极光推送的详细步骤
    本文详细介绍了如何在 Flutter 项目中集成极光推送服务,包括配置和测试的具体步骤。 ... [详细]
  • 字符串学习时间:1.5W(“W”周,下同)知识点checkliststrlen()函数的返回值是什么类型的?字 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战
    OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • 在Android 4.4系统中,通过使用 `Intent` 对象并设置动作 `ACTION_GET_CONTENT` 或 `ACTION_OPEN_DOCUMENT`,可以从相册中选择图片并获取其路径。具体实现时,需要为 `Intent` 添加相应的类别,并处理返回的 Uri 以提取图片的文件路径。此方法适用于需要从用户相册中选择图片的应用场景,能够确保兼容性和用户体验。 ... [详细]
  • 在尝试为 Unity 编译一个简单的 Java 库时,运行 `ant jar` 命令后遇到了 Java I/O 异常。具体错误信息为“无法启动程序 ${aAPT},错误代码 2”,这通常表示指定的文件或目录不存在。此问题可能是由于环境配置不正确或路径设置有误导致的。建议检查相关路径和环境变量,确保所有依赖项都已正确安装和配置。 ... [详细]
  • 全面解析JavaScript代码注释技巧与标准规范
    在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
author-avatar
神奇伟哥
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有