在Widget销毁之前将WebView的监听和view销毁掉。
成都创新互联专注于桐乡网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供桐乡营销型网站建设,桐乡网站制作、桐乡网页设计、桐乡网站官网定制、重庆小程序开发服务,打造桐乡网络公司原创品牌,更为您提供桐乡网站排名全网营销落地服务。
flutter生命周期大体上可以分为三个阶段:初始化、状态变化、销毁。
1、初始化阶段
对应执行构造方法和initState时候2、状态变化阶段
开新的widget或者调用setState方法的时候
3、销毁阶段
deactivate和dispose
二、生命周期阶段执行的函数
1、initState调用次数:1次
插入渲染树时调用,只调用一次,widget创建执行的第一个方法,这里可以做一些初始化工作,比如初始化State的变量。2、didChangeDependencies调用次数:多次
初始化时,在initState()之后立刻调用
当依赖的InheritedWidgetrebuild,会触发此接口被调用。实测在组件可见状态变化的时候会调用
3、build调用次数:多次初始化之后开始绘制界面。setState触发的时候会
4、didUpdateWidget调用次数:多次组件状态改变时候调用。
5、deactivate当State对象从树中被移除时,会调用此回调,会在dispose之前调用。页面销毁的时候会依次执行:deactivatedispose
6、dispose调用次数:1次当State对象从树中被永久移除时调用;通常在此回调中释放资源。
7、reassemble在热重载(hotreload)时会被调用,此回调在Release模式下永远不会被调用。
flutter也有自己的生命周期,不像Android中Application、Activity、Fragment生命周期分得这么明细,flutter中只在StatefulWidget维护的State中维护了5个生命周期函数(可用于App中的页面跳转,相当于Android中View的生命周期)。而Activity中的生命周期可以通过实现WidgetsBindingObserver 接口,在didChangeAppLifecycleState()中获取状态回调。
initState()--didChangeDependencies()--deactivate()--dispose() didUpdateWidge()
1.Widget A打开Widget B: 调用 Navigator.push(B)
2.Widget B从Widget A退出: 调用Navigator.pop()
可以看出, Flutter打开、关闭Widget时跟安卓、iOS的时序一样, 都是先处理即将显示的界面。
Flutter提供了WidgetsBindingObserver来监听AppLifecycleState, 而AppLifecycleState有4种状态:
1、 resumed 界面可见, 同安卓的onResume。
2、inactive界面退到后台或弹出对话框情况下, 即失去了焦点但仍可以执行drawframe回调;同安卓的onPause;
3、paused应用挂起,比如退到后台,失去了焦点且不会收到 drawframe 回调;同安卓的onStop;
4、suspending, iOS中没用,安卓里就是挂起,不会再执行 drawframe 回调;
5、关于drawframe回调:Vsync信号到来之后,Engin会按顺序回调 window 的两个回调函数: onBeginFrame() 和 onDrawFrame() 。这两个回调是 SchedulerBinding 初始化的时候设置给 window 的。对应的是 SchedulerBinding.handleBeginFrame() 和 SchedulerBinding.handleDrawFrame() 。
应用场景:
1、初次打开widget时,不执行AppLifecycleState的回调;
2、按home键或Power键, AppLifecycleState inactive----AppLifecycleState pause
3、从后台到前台:AppLifecycleState inactive---ApplifecycleState resumed
4、back键退出应用: AppLifecycleState inactive---AppLifecycleState paused
1.当我们使用flutter开发的时候 页面里面只有 initState 与dispose方法.
initState 只有进入页面的时候调用,并且在二级页面返回的时候 是不会有调用的
dispose 当页面销毁的时候 才会调用,你进入二级页面是不会调用的
综上分析者两个方法没有办法友盟页面统计分享上报
2.我们可以使用 NavigatorObserver来解决
首先新建一个 继承与NavigatorObserver的类 实现NavigatorObserver 的方法就可以了
最后我们需要再 MaterialApp里面的navigatorObservers添加监听就可以了
这时候 会有一个问题点击tabbar几个主页是没有统计的 ,我们也需要再tabbar的点击方法来进行处理
首先要在main.dart文件里创建全局路由监听对象
传入MaterialApp的navigatorObservers属性里
在需要的页面里使用routeObserver加入监听:
1.在该页面的State混入RouteAware
2.重写didChangeDependencies方法加入监听
3.在页面dispose时销毁监听
4.重写需要监听的事件方法
当Push到该页面时:
当Pop到该页面时:
当该页面Push到其他页面时:
当该页面被Pop时:
2022.6.11:
注册监听入参类型有变化
这里需要混入WidgetsBindingObserver,重写didChangeAppLifecycleState方法才能看到app进入前后台的状态
我这边使用的是一个嵌套行页面,主页面(TabBarViewPage)是一个TabBar+TabBarView实现的子页面切换,子页面是三个页面(HomeItemPage,EmailItemPage,MineItemPage)
子页面互相切换的时候下一个页面创建,上一个页面就会被销毁,这是flutter默认的情况,页面会被移除然后重载。当然你也可以设置需要的页面不被重载的页面,这个后面再讲
解决页面重载需要三步
可以看到home并没有被销毁也没有重载,但是mail被销毁了然后重载了
可以看到当主页面销毁的时候,home也是被销毁的