flutter友盟分享_flutter友盟统计之界面统计
2020.10.20日更新:
最近發現了一種更好的方法,就是使用RouteAware監聽路由,下面是實現代碼
初始化:
RouteObserver需要申明為全局屬性并作為參數傳入MaterialApp中
static final RouteObserver routeObserver = RouteObserver();
@override
Widget build(BuildContext context) {
return MaterialApp(
navigatorObservers: [AppRoutesManager.routeObserver],
...
);
}
使用
abstract class BaseState extends State with RouteAware {
String pageName;
E viewModel;
void initState() {
super.initState();
}
@override
void didChangeDependencies() {
AppRoutesManager.routeObserver.subscribe(this, ModalRoute.of(context)); //訂閱
super.didChangeDependencies();
print("didChangeDependencies: ${pageName}界面");
}
@override
void didPush() {
debugPrint("------> didPush-進入${pageName}");
super.didPush();
}
@override
void didPop() {
debugPrint("------> didPop離開${pageName}");
super.didPop();
}
@override
void didPopNext() {
debugPrint("------> didPopNext-進入${pageName}");
super.didPopNext();
}
@override
void didPushNext() {
debugPrint("------> didPushNext-${pageName}進入下一個界面");
super.didPushNext();
}
@override
void dispose() {
AppRoutesManager.routeObserver.unsubscribe(this); //取消訂閱
super.dispose();
// print("dispose 離開${pageName}界面");
print("銷毀${pageName}界面");
}
但是這個方法有一定的缺陷:
1,AlertView,showGeneralDialog等彈出框里面push的路由沒有辦法監聽,我的解決辦法是是寫一個回調函數來讓主界面來處理路由的push;
2,當使用PageView做界面切換時,監聽也是不生效的,這個時候需要自己手動調用RouteAware里面的函數。
下面是之前的實現方法:
之前項目集成了友盟統計的功能,發現flutter界面統計無法實現,在iOS中我們可以通過Controller的生命周期中的viewWillAppear:來處理什么時候進入界面viewWillDisappear:來處理什么時候來開界面,離開界面的處理,flutter的組件雖然也有生命周期,但是它的生命周期不足以支持我們準確的統計,雖然我們可以用initState做進入的的邏輯,用dispose做離開的邏輯,但是initState 只有在組件第一次初始化的時候跳用,dispose只有在組件銷毀的時候才會調用;當我們使用Navigator.push離開當前界面進入下一個界面時我們沒有辦法做處理,當然我們也可以選擇在每一個push的地方做處理,但是這樣就會出現大量的重復代碼,顯然不符合我們的初衷,經過思考我給出了下面這個方案:
1,寫一個基類BaseState繼承自State,其中有一個參數pageName
abstract class BaseState extends State {
String pageName;
void initState() {
// TODO: implement initState
super.initState();
print("initState 進入${pageName}界面");
FlutterBlUmpushPlugin.umengEnterViewWithName(pageName);
}
@override
Widget build(BuildContext context) {
return build(context);
}
@override
void dispose() {
// TODO: implement dispose
super.dispose();
print("dispose 離開${pageName}界面");
print("銷毀${pageName}界面");
FlutterBlUmpushPlugin.umengOutViewWithName(pageName);
}
}
2,實現一個push函數,做統一的界面跳轉,利用Future的特性做界面的離開,進入邏輯處理:
//跳轉界面
void push({Widget page, Function popCallback}) {
print("push: 離開${pageName}界面");
FlutterBlUmpushPlugin.umengOutViewWithName(pageName);
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) {
return page;
})).then((data) {
print("pop 進入${pageName}界面");
FlutterBlUmpushPlugin.umengEnterViewWithName(pageName);
if (popCallback != null) {
popCallback(data);
}
});
}
//路由跳轉
void routerPush({String route, Function popCallback}) {
print("routerPush: 離開${pageName}界面");
FlutterBlUmpushPlugin.umengOutViewWithName(pageName);
AppRoutesManager.router.navigateTo(context, route).then((data) {
print("pop 進入${pageName}界面");
FlutterBlUmpushPlugin.umengEnterViewWithName(pageName);
if (popCallback != null) {
popCallback(data);
}
});
}
使用:
class MinePage extends StatefulWidget {
@override
_MinePageState createState() => _MinePageState();
}
class _MinePageState extends BaseState with AutomaticKeepAliveClientMixin {
@override
bool get wantKeepAlive => true;
@override
void initState() {
// TODO: implement initState
pageName = "個人中心";
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: CustomAppBar(
title: pageName,
),
body: GestureDetector(
onTap: () {
routerPush(route: AppRoutesManager.mall, popCallback: (data) {});
},
child: Container(
color: Colors.red,
),
),
);
}
}
注:如果是安卓的話可以通過initState(), deactivate()加一個bool類型的參數處理,不知道為什么iOS端的deactivate()函數在push下一個界面的時候不調用。
總結
以上是生活随笔為你收集整理的flutter友盟分享_flutter友盟统计之界面统计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微服务--API网关
- 下一篇: 对接第三方顺丰丰桥下单Api接口实战教程