为何有人会喜欢Flutter?Flutter 的好与坏

如下图,今天在知乎收到了这样一个问题: “为什么有人喜欢 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-nativeweex 上 时不时遇到:“在 Android 端调整完样式后,在 iOS 端不生效或者异常的情况”,这是因为 react-native 和 weex 等框架需要依赖原生控件,而原生的控件在不同版本和平台上都存在一定的差异化。

这样的区别主要在于: react-native 在不同平台上渲染出来的控件效果会有平台差异,样式和参数效果随着版本更新,不同平台甚至同平台不同型号都可能出现不一样的问题,而 Flutter 至少在 UI 效果上很好的实现了统一

我日常在开发 App 时,UI 效果很多时候我只需要在 IOS 模拟器上进行调试开发,然后回到 Android 平台除了尺寸问题外,基本很少遇到需要兼容UI的情况。

关于 skia 引擎在 Android 平台默认就自带了,并且 Android 原生控件最后本来也是使用 skia 进行渲染,所以可以实现平台上性能的接近,而 iOS 平台需要把 skia 打包进 App 里,所以应用体积会略微变大,从下面的简单对比也可以看到为什么 Flutter 性能会比较好。

3

那为什么很多人感知 Flutter 性能不好呢?抛开个人代码问题, 最大的问题其实是 Flutter 很不适合混合开发

相较于 react-native ,在混合开发时因为最终渲染树都是在同一个领域内,所以能够较为简单的和原生平台接壤,而 Flutter 的 UI 本身就独立于原生渲染树,混合成本大大提高。

另外 Flutter 类似于轻量级的游戏引擎,所以它很吃内存,特别是在 iOS 上,混合开发会导致应用大小和内存使用的大幅度增加,我一直不提倡 Flutter 使用混合开发。

所以不同场景应该选择不同框架,没有最好的,只有最合适的。

至于吐槽最多的应该就是 Flutter 嵌套恶心,是的, Flutter 的嵌套看起来很弱智,但是它为什么这这样设计?

其中一个原因是因为 Flutter 中你写的 Widget 并不是真正的控件 ,在 Flutter 的 dart framework 里, Flutter 的状态管理和渲染需要经历 Widget -> Element -> RenderObject -> Layer 等的变换过程 ,开发者编写的 Widget 代码,其实在 Flutter 中定位更像配置文件,而这些配置文件可以通过模版的方式来减少不必要的嵌套,其中官方的 Container 就是很好的例子。

推荐阅读
相关专栏
前端与跨平台
90 文章
本专栏仅用于分享音视频相关的技术文章,与其他开发者和声网 研发团队交流、分享行业前沿技术、资讯。发帖前,请参考「社区发帖指南」,方便您更好的展示所发表的文章和内容。