日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

flutter友盟分享_flutter友盟统计之界面统计

發布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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友盟统计之界面统计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。