2026-04-12 14:38:12
在Flutter中设计一个高准确率的埋点框架,需针对页面进入/离开、曝光坑位、点击坑位等关键场景,结合Flutter特性与业务需求进行定制化实现。以下是具体方案:
一、页面进入/离开埋点核心问题:Flutter页面栈与Native不同,无法直接复用原生方案(如Android的onResume/onPause或iOS的viewWillAppear/viewDidDisappear)。
方案1:基于NavigatorObserver的改进(通用方案)问题1:页面复现时无法触发进入事件维护一个与页面栈匹配的索引列表,记录页面进入/离开状态:
Push事件:新页面入栈时,若栈内已有页面,则对栈顶页面触发离开事件,新页面触发进入事件。
Pop事件:页面出栈时,触发离开事件,并检查栈顶页面是否可见(通过ModalRoute.of(context).isCurrent),若可见则触发进入事件。
问题2:Dialog/BottomSheet干扰通过Route.overlayEntries判断图层是否全屏覆盖(opaque属性),排除非全屏组件的干扰。仅对有效页面操作索引列表。


定义:坑位在屏幕可见区域面积≥50%且停留时间>500ms。
实现步骤从不可见到可见:记录出现时间。
从可见到不可见:若停留时间>500ms,触发埋点。
if (当前坑位是invisible && 曝光比例 >= 0.5) { 记录当前坑位是visible状态 记录出现时间} else if (当前坑位是visible && 曝光比例 < 0.5) { 记录当前坑位是invisible状态 if (当前时间-出现时间 > 500ms) { 调用曝光埋点接口 }}
方案:通过GestureDetector或InkWell封装点击事件,直接在回调中触发埋点,无需复杂逻辑。
四、效果与优化通过上述方案,可构建一个高准确率、无侵入性的Flutter埋点框架,满足复杂业务场景需求。