如下图,今天在知乎收到了这样一个问题: “为什么有人喜欢 Flutter ?” ,相信对于刚刚接触 Flutter 的人可能都会有这样的疑问。
Flutter 最有价值的点不是它的语言,也不是它的代码设计模式,是它的跨平台。
Flutter 的跨平台不同于 weex、react-native ,它核心是跨平台的优秀设计。以前的应用跨平台框架都需要依赖原生平台的控件,比如: react-native 的 <View>
标签需要转化为 Android 平台的 ViewGroup 控件,然后实现渲染。
但是 Flutter 直接使用 skia 引擎实现 GPU/CPU 的渲染 ,所以 Flutter 默认情况下的 Widget 控件都是平台无关的,只要你的平台有 GPU/CPU ,然后提供一个画板(Surface),剩下的 UI 效果完全由 Flutter Engine 处理,这让 Flutter 的 UI 和平台的关联性很低。
对比以前在 react-native 和 weex 上 时不时遇到:“在 Android 端调整完样式后,在 iOS 端不生效或者异常的情况”,这是因为 react-native 和 weex 等框架需要依赖原生控件,而原生的控件在不同版本和平台上都存在一定的差异化。
这样的区别主要在于: react-native 在不同平台上渲染出来的控件效果会有平台差异,样式和参数效果随着版本更新,不同平台甚至同平台不同型号都可能出现不一样的问题,而 Flutter 至少在 UI 效果上很好的实现了统一 。
我日常在开发 App 时,UI 效果很多时候我只需要在 IOS 模拟器上进行调试开发,然后回到 Android 平台除了尺寸问题外,基本很少遇到需要兼容UI的情况。
关于 skia 引擎在 Android 平台默认就自带了,并且 Android 原生控件最后本来也是使用 skia 进行渲染,所以可以实现平台上性能的接近,而 iOS 平台需要把 skia 打包进 App 里,所以应用体积会略微变大,从下面的简单对比也可以看到为什么 Flutter 性能会比较好。
那为什么很多人感知 Flutter 性能不好呢?抛开个人代码问题, 最大的问题其实是 Flutter 很不适合混合开发 。
相较于 react-native ,在混合开发时因为最终渲染树都是在同一个领域内,所以能够较为简单的和原生平台接壤,而 Flutter 的 UI 本身就独立于原生渲染树,混合成本大大提高。
另外 Flutter 类似于轻量级的游戏引擎,所以它很吃内存,特别是在 iOS 上,混合开发会导致应用大小和内存使用的大幅度增加,我一直不提倡 Flutter 使用混合开发。
所以不同场景应该选择不同框架,没有最好的,只有最合适的。
至于吐槽最多的应该就是 Flutter 嵌套恶心,是的, Flutter 的嵌套看起来很弱智,但是它为什么这这样设计?
其中一个原因是因为 Flutter 中你写的 Widget
并不是真正的控件 ,在 Flutter 的 dart framework
里, Flutter 的状态管理和渲染需要经历 Widget
-> Element
-> RenderObject
-> Layer
等的变换过程 ,开发者编写的 Widget
代码,其实在 Flutter 中定位更像配置文件,而这些配置文件可以通过模版的方式来减少不必要的嵌套,其中官方的 Container
就是很好的例子。