西瓜视频落地Flutter,给你的避坑指南
极客时间编辑部
讲述:丁婵大小:9.21M时长:06:42
你好,欢迎收听极客视点。
Flutter 是目前最火的跨平台技术,在提供极好的用户体验的同时能解决多端一致性的问题,而且还能有效地降低人力成本。在谷歌正式发布 Flutter 之后,各大厂纷纷布局并逐步落地,国内大厂像阿里巴巴、字节跳动、美团等已经走在了 Flutter 队伍的前列,比起怎么引入 Flutter,现在大家更关心的是 Flutter 的进展和踩坑经历。
Flutter 落地中遇到的问题
西瓜视频在引入 Flutter 的过程中发现了很多问题,如:iOS 原生手势与 Flutter 内部手势冲突、状态管理问题等,在遇到这些问题之后沉淀了一些自己的解决方案。
对于 iOS 原生手势和 Flutter 内部手势冲突问题,徐东解释道, iOS 原生手势处理的优先级比 Flutter 的手势高,所以一旦在 FlutterViewController 上添加了 iOS 手势,那么就可能会导致 Flutter 内的手势失效。为了解决这个问题,西瓜视频开发了一个 FlutterView 代理手势识别器,它可以“平等地”和 iOS 原生手势沟通协作,这样就能够利用 iOS 原生手势系统的规则,来解决 Flutter 和 iOS 的手势冲突问题。
对于状态管理问题,徐东称复杂控件可能有非常多的状态变量和逻辑,如果用单一 StatefullWidget 会导致代码爆炸,拆分多个 StatefullWidget 又会有信息共享难的问题。西瓜视频目前开发了一套 Redux 库来解决,主要特点是:
通过 source_gen 和 build_runner 自动生成 State/Store,避免了手写 equals、hashCode、constructor 方法。
架构简单,避免过多概念,只包含最基础的 Store、State、Reducer、Action、Listener。
Store 中保存了一棵 State 树,树上的任意一个状态变量都可以单独设置监听器,这样可以避免大面积重绘。
据徐东介绍,目前西瓜视频 App 内有三十个左右页面使用 Flutter 开发,一个面向作者的业务线基本上都是用 Flutter 开发的,人效基本提升了 50%。
但是,目前看,在 Flutter 环境下实现播放器主要有两个方案:一种是 Platform View,一种是外接纹理的方案。Platform View 方案需要依赖原生 View,两端使用不同的方式实现 UI。徐东认为这就失去了使用 Flutter 的意义,所以西瓜视频实现的播放器使用的是外接纹理方案。简单来说就是底层使用原生播放器库生成纹理,然后将纹理给 Flutter 引擎渲染。
在播放器落地的过程中,西瓜视频遇到了几个需要注意的细节问题。一是目前 Flutter 外接纹理需要原生侧提供 RGBA 的纹理供 Skia 渲染,RGBA 会比 YUV 使用更多的内存,如果是对内存用量非常敏感,那就需要特别注意考虑其他方案了。
二是 iOS 外接纹理需要实现 copyPixelbuffer 方法,将 CVPixelbufferRef 引用计数加 1 后传递给 Flutter 引擎,正常情况下引擎会为这个 Pixelbuffer 的引用计数减 1,这就保证了 Pixelbuffer 不会被泄漏,但是如果 copyPixelbuffer 连续几次调用返回同一个 Pixelbuffer, 并且每次引用计数都增加了,那么这个 Pixelbuffer 会被泄漏,因为引擎遇到相同的 Pixelbuffer 并不会多次减少引用计数。可以在发现连续生成相同的 Pixelbuffer 时,copyPixelbuffer 应该返回 NULL。
跨端技术选型要注意
除上述问题以外,徐东还提到使用 Flutter,工程师反馈最多的问题是跨端的调试体验很差,不过这不完全是 Flutter 的问题,而是跨端开发这个最核心理念引发的问题。
解决这个问题可能有两个方向:一是加强团队成员的基础素质,向着一人熟悉三端的水平前进,虽然难,但并不是不可能做到。二是想办法让工程师不需要关心原生工程和技术。
另外,徐东也提到,在一个规模比较大的团队选择跨端技术还是要谨慎些,尤其是在你希望团队大规模应用的情况下,以下几点需要好好思考一下:
1. 这个技术的理论上限是否和原生足够接近?
一个跨端技术如果仅仅只是能够跨端,性能很一般、开发体验很一般,那么很有可能没法落地,因为跨端技术想落地对团队现有工作方式冲击还是很大的,这也是一个不可忽视的成本,除非性能几乎和原生一样,能够让人感觉“真香”,否则真的很难有人买账。
2. 团队技术储备是否能铺平道路、抵御风险?
Android 和 iOS 原生开发已经发展了十多年了,整个生态和基础都比较成熟,而各种跨端技术相对来讲还都比较年轻,有很多不完善的地方。团队需要有足够的技术储备来解决各种问题,否则可能不仅没提升效率,还拖慢了效率。
3. 团队希望在多大范围内使用跨端技术?
如果你的产品人员偏向于将 Android 和 iOS 客户端体验设计成两种 UI,或者你的应用大部分都是图像和视频编辑之类的功能,那恐怕只能思考一下底层逻辑能不能用 C/C++ 跨端了。但如果你的应用是偏展示型的,则非常适合选择一些 UI 跨端的技术,像 Flutter 之类的。
以上就是西瓜视频落地 Flutter 的采坑经验,希望对你有所帮助。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
请先领取课程
免费领取
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论