极客视点
极客时间编辑部
极客时间编辑部
113243 人已学习
免费领取
课程目录
已完结/共 3766 讲
2020年09月 (90讲)
时长 05:33
2020年08月 (93讲)
2020年07月 (93讲)
时长 05:51
2020年06月 (90讲)
2020年05月 (93讲)
2020年04月 (90讲)
2020年03月 (92讲)
时长 04:14
2020年02月 (87讲)
2020年01月 (91讲)
时长 00:00
2019年12月 (93讲)
2019年11月 (89讲)
2019年10月 (92讲)
2019年09月 (90讲)
时长 00:00
2019年08月 (91讲)
2019年07月 (92讲)
时长 03:45
2019年06月 (90讲)
2019年05月 (99讲)
2019年04月 (114讲)
2019年03月 (122讲)
2019年02月 (102讲)
2019年01月 (104讲)
2018年12月 (98讲)
2018年11月 (105讲)
时长 01:23
2018年10月 (123讲)
时长 02:06
2018年09月 (119讲)
2018年08月 (123讲)
2018年07月 (124讲)
2018年06月 (119讲)
时长 02:11
2018年05月 (124讲)
时长 03:16
2018年04月 (120讲)
2018年03月 (124讲)
2018年02月 (112讲)
2018年01月 (124讲)
时长 02:30
时长 02:34
2017年12月 (124讲)
时长 03:09
2017年11月 (120讲)
2017年10月 (86讲)
时长 03:18
时长 03:31
时长 04:25
极客视点
15
15
1.0x
00:00/06:42
登录|注册

西瓜视频落地Flutter,给你的避坑指南

讲述:丁婵大小:9.21M时长:06:42
你好,欢迎收听极客视点。
Flutter 是目前最火的跨平台技术,在提供极好的用户体验的同时能解决多端一致性的问题,而且还能有效地降低人力成本。在谷歌正式发布 Flutter 之后,各大厂纷纷布局并逐步落地,国内大厂像阿里巴巴、字节跳动、美团等已经走在了 Flutter 队伍的前列,比起怎么引入 Flutter,现在大家更关心的是 Flutter 的进展和踩坑经历。
最近,字节跳动资深工程师、西瓜视频 Flutter 团队负责人徐东接受 InfoQ 采访,分享了西瓜视频在落地 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
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
43
沉浸
阅读
分享
手机端
快捷键
回顶部