8.5 用户行为分析与埋点

张开发
2026/4/15 3:43:16 15 分钟阅读

分享文章

8.5 用户行为分析与埋点
数据驱动产品迭代。通过埋点收集用户行为数据结合 Firebase Analytics 或自研统计平台分析用户路径、转化漏斗和功能使用情况。一、Firebase Analyticsdependencies:firebase_core:^2.30.0firebase_analytics:^10.10.01.1 基础事件上报importpackage:firebase_analytics/firebase_analytics.dart;classAnalyticsService{staticfinal_analyticsFirebaseAnalytics.instance;// 设置用户属性staticFuturevoidsetUser(StringuserId,{String?userType})async{await_analytics.setUserId(id:userId);if(userType!null){await_analytics.setUserProperty(name:user_type,value:userType);}}// 页面浏览staticFuturevoidlogPageView(StringpageName)async{await_analytics.logScreenView(screenName:pageName);}// 用户注册staticFuturevoidlogSignUp(Stringmethod)async{await_analytics.logSignUp(signUpMethod:method);}// 用户登录staticFuturevoidlogLogin(Stringmethod)async{await_analytics.logLogin(loginMethod:method);}// 搜索staticFuturevoidlogSearch(Stringquery)async{await_analytics.logSearch(searchTerm:query);}// 查看商品staticFuturevoidlogViewItem(Productproduct)async{await_analytics.logViewItem(currency:CNY,value:product.price,items:[AnalyticsEventItem(itemId:product.id.toString(),itemName:product.name,itemCategory:product.category,price:product.price,),],);}// 加入购物车staticFuturevoidlogAddToCart(Productproduct,int quantity)async{await_analytics.logAddToCart(currency:CNY,value:product.price*quantity,items:[AnalyticsEventItem(itemId:product.id.toString(),itemName:product.name,price:product.price,quantity:quantity,),],);}// 下单电商转化漏斗staticFuturevoidlogPurchase({requiredStringorderId,required double totalAmount,requiredListProductproducts,})async{await_analytics.logPurchase(transactionId:orderId,currency:CNY,value:totalAmount,items:products.map((p)AnalyticsEventItem(itemId:p.id.toString(),itemName:p.name,price:p.price,)).toList(),);}// 自定义事件staticFuturevoidlogCustomEvent(StringeventName,{MapString,Object?parameters,})async{await_analytics.logEvent(name:eventName,parameters:parameters);}}1.2 路由自动统计GoRouterclassAnalyticsRouteObserverextendsNavigatorObserver{overridevoiddidPush(Routeroute,Route?previousRoute){super.didPush(route,previousRoute);_logPageView(route);}overridevoiddidPop(Routeroute,Route?previousRoute){super.didPop(route,previousRoute);if(previousRoute!null)_logPageView(previousRoute);}overridevoiddidReplace({Route?newRoute,Route?oldRoute}){super.didReplace(newRoute:newRoute,oldRoute:oldRoute);if(newRoute!null)_logPageView(newRoute);}void_logPageView(Routeroute){finalnameroute.settings.name??route.runtimeType.toString();AnalyticsService.logPageView(name);}}// 注册到 MaterialApp / GoRouterMaterialApp.router(routerConfig:router,navigatorObservers:[AnalyticsRouteObserver()],)二、自研埋点系统2.1 统一埋点接口// 埋点事件模型classTrackEvent{finalStringeventName;// 事件名finalString?pageName;// 来源页面finalMapString,dynamicproperties;// 附加属性finalDateTimetimestamp;TrackEvent({requiredthis.eventName,this.pageName,this.propertiesconst{},DateTime?timestamp,}):timestamptimestamp??DateTime.now();MapString,dynamictoJson(){event:eventName,page:pageName,properties:properties,timestamp:timestamp.toIso8601String(),app_version:AppInfo.version,platform:Platform.operatingSystem,device_id:DeviceInfo.deviceId,};}// 埋点 SDKclassTracker{staticfinal_queueTrackEvent[];staticTimer?_flushTimer;staticconst_batchSize20;staticconst_flushIntervalDuration(seconds:10);staticvoidinit(){// 定时刷新批量上报_flushTimerTimer.periodic(_flushInterval,(_)_flush());}// 埋点入口staticvoidtrack(StringeventName,{String?page,MapString,dynamic?properties,}){finaleventTrackEvent(eventName:eventName,pageName:page,properties:properties??{},);_queue.add(event);// 达到批量大小立即上报if(_queue.length_batchSize)_flush();}staticFuturevoid_flush()async{if(_queue.isEmpty)return;finaleventsListTrackEvent.from(_queue);_queue.clear();try{awaitAnalyticsApi.batchReport(events.map((e)e.toJson()).toList(),);}catch(_){// 上报失败重新入队下次重试_queue.insertAll(0,events);}}staticvoiddispose(){_flushTimer?.cancel();_flush();// App 关闭前立即上报}}2.2 声明式埋点装饰器模式// 自动曝光埋点 Widget进入视口时上报classTrackExposureextendsStatefulWidget{finalStringeventName;finalMapString,dynamic?properties;finalWidgetchild;constTrackExposure({super.key,requiredthis.eventName,this.properties,requiredthis.child,});overrideStateTrackExposurecreateState()_TrackExposureState();}class_TrackExposureStateextendsStateTrackExposure{bool _hasTrackedfalse;overrideWidgetbuild(BuildContextcontext){returnVisibilityDetector(key:Key(track_${widget.eventName}),onVisibilityChanged:(info){if(info.visibleFraction0.5!_hasTracked){_hasTrackedtrue;Tracker.track(widget.eventName,properties:widget.properties);}},child:widget.child,);}}// 点击埋点 Widget代理点击事件classTrackTapextendsStatelessWidget{finalStringeventName;finalMapString,dynamic?properties;finalWidgetchild;finalVoidCallback?onTap;constTrackTap({super.key,requiredthis.eventName,this.properties,requiredthis.child,this.onTap,});overrideWidgetbuild(BuildContextcontext){returnGestureDetector(onTap:(){Tracker.track(eventName,properties:properties);onTap?.call();},child:child,);}}// 使用TrackTap(eventName:click_add_to_cart,properties:{product_id:product.id,price:product.price},onTap:_addToCart,child:ElevatedButton(onPressed:null,child:constText(加入购物车)),)TrackExposure(eventName:view_product_card,properties:{product_id:product.id},child:ProductCard(product:product),)三、崩溃与性能监控// Crashlytics 崩溃上报配合 Firebaseimportpackage:firebase_crashlytics/firebase_crashlytics.dart;voidmain()async{WidgetsFlutterBinding.ensureInitialized();awaitFirebase.initializeApp();// 捕获 Flutter 框架错误FlutterError.onErrorFirebaseCrashlytics.instance.recordFlutterFatalError;// 捕获异步错误Dart ZoneawaitrunZonedGuarded(()async{runApp(constMyApp());},(error,stackTrace){FirebaseCrashlytics.instance.recordError(error,stackTrace,fatal:true);},);}// 手动上报非致命错误try{awaitriskyOperation();}catch(e,stackTrace){FirebaseCrashlytics.instance.recordError(e,stackTrace,fatal:false);}// 添加自定义日志崩溃前的上下文FirebaseCrashlytics.instance.log(用户点击了结算按钮);FirebaseCrashlytics.instance.setCustomKey(orderId,currentOrderId);FirebaseCrashlytics.instance.setCustomKey(userId,currentUserId);小结功能方案页面统计Firebase Analytics NavigatorObserver电商漏斗logViewItem → logAddToCart → logPurchase自定义埋点自研 Tracker批量队列上报声明式埋点TrackTap / TrackExposure 装饰器崩溃监控Firebase Crashlytics性能监控Firebase Performance 下一节继续阅读后续章节

更多文章