移动端的未来为什么是Flutter?( 五 )


我们曾被问到一个潜在的问题 。由于Flutter不使用原生UI组件,因此,当新的iOS或Android版本出现时,Flutter UI组件是否需要更新才能支持新的部件,或更改现有部件的外观或行为吗?
首先,Google是Flutter的内部的一个大用户,所以我们有很大的动机来更新UI组件,使其保持最新状态并尽可能接近当前的原生UI组件 。
如果有一段时间我们在更新一个UI组件时太慢,Google并不是Flutter唯一一个保持UI组件最新的用户 。Flutter的UI组件是可扩展和可定制的,任何人都可以更新它们,包括你自己,甚至不需要提交一个请求 。你永远不必等待Flutter自己更新 。
只有当您想要在应用中反映出新的更改时,上述要点才适用 。如果您不想要更改影响您的应用程序的外观或工作方式,那么就没有必要使用上面所说的 。UI组件是您的应用程序的一部分,所以UI永远不会在你不知情的情况下擅自改变,并使您的应用程序看起来不好(或更糟的是,破坏您的应用程序) 。
还有一个额外的好处,您可以编写您的应用程序,以便即使在较旧的操作系统版本上也能使用新的UI组件.
其他优势
Flutter的简单性使其运行很快,但它的可定制性和可扩展性,保持简单的同时拥有强大功能 。
Dart拥有一个软件包仓库 。您可以用这些软件包扩展应用程序的功能 。例如,有许多软件包可以轻松访问Firebase,以便您可以构建“无服务器”应用程序 。外部贡献者创建了一个可让您访问 Redux data store的软件包 。还有一些称为“plugins ”的软件包,可以以独立于操作系统的方式轻松访问平台服务和硬件,例如加速度计或相机 。
当然,Flutter也是一个开放源码的项目 ,加上Flutter渲染堆栈是应用程序的一部分,这意味着可以自定义几乎任何想要的应用程序 。该图中绿色的部分都可以定制:

移动端的未来为什么是Flutter?

文章插图
 
那么,“Flutter有什么新鲜又令人兴奋的”呢?
如果有人问你Flutter,现在你知道如何回答他们了:
响应式视图的优点,不需要JavaScript的桥接器
快速,流畅,可预测; 代码将AOT编译为本机(ARM)代码
开发人员完全控制UI组件和布局
配有美观,可定制的UI组件
强大的开发者工具,惊人的热重新加载
性能更好,兼容性更好,开发起来更有乐趣
你注意到我把什么移出这个名单吗? 这是通常人们在谈论Flutter时提到的第一件事,但对我来说,这是Flutter中最不重要的事情之一 。
这就是,Flutter可以从单个代码库为多个平台构建漂亮而快速的应用程序 。当然这应该列出来的! 它的可定制性和可扩展性可以轻松将Flutter定位到多个平台,而不会牺牲性能或功耗 。
实现跨平台
Flutter不是黑科技,应用程序的代码总是以一种非常合理,可以解释的方式的运行着,只是需要去了解而已 。Flutter能够在iOS和Android上运行起来,依靠的是一个叫Flutter Engine的虚拟机,Flutter Engine是Flutter应用程序的运行环境,开发人员可以通过Flutter框架和API在内部进行交互 。
Flutter Engine使用C/C++编写,具有低延迟输入和高帧速率的特点 。关注AR/VR的人应该都知道,AR/VR对延迟和帧速率的要求比传统游戏要高得多,因为它们要求在用户在移动时保持真实世界的稳定性 。因此笔者认为Flutter在未来的应用与发展中会占有一席之地 。
接下来以Android平台为例,简单的介绍一下Flutter的原理,有Android开发经验的人都知道,Android应用程序是运行在Dalvik虚拟机里面的,并且每一个应用程序对应有一个单独的Dalvik虚拟机实例,但是Flutter应用程序不使用Dalvik虚拟机 。
移动端的未来为什么是Flutter?

文章插图
 
以一个Flutter项目为例,当项目编译成Android后,生成的安装包大约23M 。常规的Android应用程序安装包大多都能控制在10M以内,为什么Flutter项目编译的Android安装包要23M呢?通过使用Android Studio打开该安装包查看,上面的图片是Android Studio显示的结果 。
通过观察安装包的内容,可以发现lib目录的大小约为48M,所以安装包庞大的主因就在lib目录 。lib目录下包含x86_64、x86和armeabi-v7a三种CPU类型的指令集,由此可见,Flutter编译的Android应用程序自带独立的虚拟机,也就是上面提到的Flutter Engine 。
移动端的未来为什么是Flutter?

文章插图
 
Flutter编译的iOS应用程序采取的方案是,使用iOS运行时(Runtime)实现跨平台,iOS运行时(Runtime)是一个用汇编写的一段程序,可以执行C/C++编译的二进制 。iOS原生开发的Objective-C语言也是通过iOS运行时(Runtime)执行C/C++的二进制文件,所以Flutter编译的iOS应用能和原生应用不相上下 。


推荐阅读