flutter中实现仿Android端的onResume和onPause方法

flutter中实现仿Android端的onResume和onPause方法

Android端Activity的生命周期

Android中的Activity的生命周期方法以下所示:css

Activity生命周期图

这些方法中,对咱们比较重要的以下:java

  • onCreate方法:页面建立时调用。
  • onDestroy方法:页面销毁时调用,除了正常关闭页面,还包括异常销毁,好比kill掉应用进程。
  • onResume方法:页面由不可见变为可见时调用。
  • onPause方法:页面由可见变为不可见时调用,与onResume方法成对出现。

在使用过程当中,onCreate和onDestroy方法成对出现,只会调用一次。onResume和onPause方法也是成对出现,会出现屡次。微信

这几个方法为什么如此重要呢?为何非要在flutter端获取到这几个方法呢?
这是由于在现有条件下,flutter相关的社区环境还不够强大,flutter端并不能实现一套代码适配多种终端的效果,相反,它还会严重的依赖宿主App端的实现。app

这时,就须要咱们在flutter页面中合适的时机,发送消息给宿主App,让其完成对应的实现。less

固然了,这类问题在之后可能会获得很好的解决,没必要像如今这么费劲。ide

实现效果

demo的结构
flutter_lifecycle_state
效果图

一、桌面 --> home --> a --> c --> a --> home --> 桌面学习

image

对应log:ui

I/flutter ( 1954): Home --> onCreate()
I/flutter ( 1954): Home --> onResume()
I/flutter ( 1954): ARoute --> onCreate()
I/flutter ( 1954): ARoute --> onResume()
I/flutter ( 1954): Home --> onPause()
I/flutter ( 1954): CRoute --> onCreate()
I/flutter ( 1954): CRoute --> onResume()
I/flutter ( 1954): ARoute --> onPause()
I/flutter ( 1954): ARoute --> onResume()
I/flutter ( 1954): CRoute --> onPause()
I/flutter ( 1954): CRoute --> onDestroy()
I/flutter ( 1954): Home --> onResume()
I/flutter ( 1954): ARoute --> onPause()
I/flutter ( 1954): ARoute --> onDestroy()
I/flutter ( 1954): Home --> onPause()
复制代码

这里解释下:
桌面 --> home操做对应log: 一、2行
home --> a操做对应log: 三、四、5行
a --> c操做对应log: 六、七、8行
c --> a操做对应log: 九、十、11行
a --> home操做对应log: 十二、1三、14行
home --> 桌面操做对应log: 15行spa

二、桌面 --> home --> b --> e --> b --> home --> 桌面3d

image

对应log:

I/flutter ( 2048): Home --> onCreate()
I/flutter ( 2048): Home --> onResume()
I/flutter ( 2048): BRoute --> onCreate()
I/flutter ( 2048): BRoute --> onResume()
I/flutter ( 2048): Home --> onPause()
I/flutter ( 2048): FRoute --> onCreate()
I/flutter ( 2048): FRoute --> onResume()
I/flutter ( 2048): BRoute --> onPause()
I/flutter ( 2048): BRoute --> onResume()
I/flutter ( 2048): FRoute --> onPause()
I/flutter ( 2048): FRoute --> onDestroy()
I/flutter ( 2048): Home --> onResume()
I/flutter ( 2048): BRoute --> onPause()
I/flutter ( 2048): BRoute --> onDestroy()
I/flutter ( 2048): Home --> onPause()
复制代码

这里解释下:
桌面 --> home操做对应log: 一、2行
home --> b操做对应log: 三、四、5行
b --> e操做对应log: 六、七、8行
e --> b操做对应log: 九、十、11行
b --> home操做对应log: 十二、1三、14行
home --> 桌面操做对应log: 15行

项目地址:

flutter_lifecycle_state

使用方式:

一、添加依赖:

在pubspec.yaml文件中添加以下依赖:这里选择最新版本便可。

dependencies:
  flutter_lifecycle_state: ^0.0.x
复制代码

note:最新配置请看pub.dartlang.org/packages/fl…页面。

二、给MaterialApp#navigatorObservers属性设置routeObserver。

这个值定义在咱们的package包中,须要导包。

import 'package:flutter/material.dart';
import 'package:flutter_lifecycle_state/flutter_lifecycle_state.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      ...
      navigatorObservers: [routeObserver],
    );
  }
}
复制代码
三、页面中使用StateWithLifecycle替换State。

将每一个页面级别的Widget的State替换为咱们的StateWithLifecycle,导包便可。而后咱们能够选择重写onCreate、onPause、onResume、onDestroy方法,在这些方法内部执行对应的业务逻辑便可。

若是须要自定义当前页面的log标识的话,以下所示:给tagInStateWithLifecycle字段赋值便可。

@override
  void initState() {
    tagInStateWithLifecycle = "WidgetsTestPage";
    super.initState();
  }
复制代码

注意事项

须要注意的是:

一、onDestroy方法某些状况下不会调用

在flutter项目的根页面中,在它正常销毁时,它的的dispose方法是不会调用的,所以咱们的onDestroy方法也不会调用。

二、应用非正常关闭时,生命周期方法不会调用。

这就意味着,若是应用在后台被回收,或者其余方式非正常关闭,则某些页面的生命周期方法可能不会正常的调用。

 小编这呢,给你们推荐一个优秀的iOS交流平台,平台里的伙伴们都是很是优秀的iOS开发人员,咱们专一于技术的分享与技巧的交流,你们能够在平台上讨论技术,交流学习。欢迎你们的加入(想要进入的可加小编微信)。

微信号:17336563535

来源:本文为第三方转载,若有侵权请联系小编删除。

相关文章
相关标签/搜索