| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> 工程实践 | 在 Flutter 中实现一个精准的滑动埋点 -> 正文阅读 |
|
[移动开发]工程实践 | 在 Flutter 中实现一个精准的滑动埋点 |
文/ Vadaski,CFUG 社区成员,滴滴国际化研发工程师 前言今天的这篇文章要介绍的内容,是我们经常会用到的一个场景:埋点。为了对行为特征的数据进行量化分析、优化产品, 我们常常需要在特定的时机上报数据埋点, 而曝光埋点则是其中的一个高频使用场景。 🥲 滑动埋点的痛在 Flutter 中,我们通常会在 很明显,我们把本来没有展示的 widget 也给打印出来了。如果这样做,埋点上报不准确,将会给业务带来不可恢复的损失。 🤯 ScrollView 加载机制为什么会出现这种情况呢?在查阅了源码之后,我们发现所有的 那么很自然我们能够想到一个最简单的解决方案:把预加载机制给禁用掉不就可以了嘛:
好了,本文到此结束,你学会了吗。😏 🤔 新的问题开个玩笑,相信大家很容易就能够联想到,这样做大概率会产生性能问题。在我们真实业务中,会考虑到支持的最差的设备性能,以及业务的复杂性,肯定不是这样简单的取消掉预加载就能够解决的。 在做测试的时候,会发现如果去掉缓存机制,平均帧率会下降 5-10 帧左右, 还是在比较好的一加手机上的测试结果,这当然是不能接受的。(更何况本身在 1.x 版本 的 Flutter 下 ListView 性能就有一些问题) 所以我们想要的是一套 🤨 破局想清楚了需求,就有了一半的思路。在我们查阅了业界现有的资料后,发现闲鱼技术已经分享了一个比较好的解题思路:揭秘!一个高准确率的 Flutter 埋点框架如何设计[1]。奈何这个方案也没有开源的计划,那就只有自己来写一个吧。这个问题应该如何解呢? 在前面我们提到过,每一个 一个复杂的问题需要把它抽象成更简单的问题然后逐步求解。我们不妨先把 Item 看成一个点,看看要计算一个 Item 是否在 很容易能够想到和滑动的偏移量 (Scroll Offset),以及 Viewport 在滑动方向上的长度 (Viewport Length), 还有 item 自身的信息,也就是当前 item 距离滑动起始点的距离 (Exposure Offset) 相关。 想象一下滑动的样子,一个 Item 从
对于从左边划入右边则是这几个状态:
通过观察可以发现,Item 从左边划入和从右边划入它的判断时机是不一样的,所以我们需要区分两种滑动情况。 下面我们把 Item 自身的宽度 (Item Width)也带上,再使用上面得出的结论来进行计算。
对于从左边划入右边则是这几个状态:
🧩 如何获取这些信息知道了解法之后,接下来就只需要寻找这些拼图的碎片就行了。 Item 大小信息这块比较简单,我们都知道可以通过 Widget 的
这里的 context 是我们想要判断是否曝光的 Item 的 context,如果你对这个概念还不太清楚,可以去看看这篇 深入理解 BuildContext[2]。
ViewPort 大小信息我们在进行曝光判断的时候,肯定是在每一个 Item 中进行的,而
我们刚刚已经拿到了 Item 对应的渲染对象,
Item 相对 ViewPort 的滑动起始点的距离在
滑动距离要获得滑动距离通常有两种方式:
每次编写代码的时候都必须得写 Scroll NotificationScrollable Widget 将会向其其祖先通知有关滚动变化信息,而这些信息能够使用
我们这里使用
解决信息共享问题看到这里,似乎我们要的拼图都凑齐了,但是总感觉哪里不对劲?🧐 如果你敏锐的话,想必已经发现我们现在这样的设计根本没法在一个地方拿到全部信息。 Scroll Notification 仅会向祖先节点发起 Notification 通知,也就是说,我们在 Item 层级是拿不到的! 如果我们想要在 Item 中进行埋点曝光判定,就必须要获取到更高的祖先节点中的 当然解法肯定有很多,共享状态的方法在状态管理中是一个常见的 Case,但是为了滑动埋点曝光就引入一个状态管理库似乎有些得不偿失,所以还不如使用 Flutter 最原始的 Inherit 机制来实现数据的共享。 什么是 Inherit 机制要理解 Inherit 机制,首先你需要了解 Flutter 的三棵树, 这个网上的解释文章已经有很多了,我就不再赘述, 感兴趣的可以看看 迷鹿[3]的这篇 Widget、Element、Render 是如何形成树结构?[4]。 简单来说,Inherit 机制是一种能够在 Flutter 中自顶向下共享数据的方式,我们知道 Flutter 是通过树形结构来构建视图的,而其中的 它的原理也是很简单,每个 Element 都持有了一个叫做
而
基于此,我们就可以完成对于滑动埋点曝光的计算了,可喜可贺。 拿来吧你像我们这样有经验的开发者,看到这样好的文章,第一时间那一定是想要 自己实践一下。
所以为了各位宝贵的 (滑水/唠嗑/带娃/...) 时间,这款滑动埋点方案已经登陆了 Pub 仓库[5],各位可以放心食用了。 目前已经支持的有:
这个项目我会一直维护下去 (毕竟自己也要用), 如果你想了解该项目的最新进展, 可以关注该项目的 GitHub[6], 或者有需要增加的功能需求,也欢迎通过邮箱与我联系:
写在最后这个解决方案其实是在去年公司里就用到了,一直没有来得及开源。在这里也感谢 闲鱼技术[7] 提供的宝贵思路, 最近凑了一些零零碎碎的时间把它给完成了,把趁着国庆第一天写完了这篇文章, 希望大家能通过我的分享有一点点收获~ 我是鑫磊,和你一起快乐学习 Flutter 的工程师,大家国庆快乐,我们之后再见 👋 文内链接[1] 揭秘!一个高准确率的 Flutter 埋点框架如何设计: https://juejin.cn/post/6844903864479514631#comment [2]深入理解 BuildContext: https://juejin.cn/post/6844903777565147150 [3]迷鹿: https://juejin.cn/user/4309694831660711 [4]Widget、Element、Render 是如何形成树结构?: https://juejin.cn/post/6921493845330886670 [5]Pub 仓库: https://pub.flutter-io.cn/packages/flutter_exposure [6]GitHub: https://github.com/Vadaski/flutter_exposure [7]闲鱼技术: https://juejin.cn/post/6955304605190357005 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 10:18:44- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |