Flutter 监听生命周期事件

栏目: Android · 发布时间: 5年前

内容简介:在Flutter中我们能监听的生命周期有以下几种:下面的例子展示如何通过WidgetsBindingObserver来监听一个Widget的生命周期:首先通过mixin(读作mix in,详情参阅

监听生命周期事件

  • in Android
    • 我们可以重写Activity或者Fragment的生命周期回调方法来监听它们的生命周期并做相应的处理。
  • in Flutter
    • 我们可以利用WidgetsBindingObserver来监听Widget的生命周期,具体怎么使用后面有例子说明。

在Flutter中我们能监听的生命周期有以下几种:

  • resumed – 应用程序处于可见状态,并且可以响应用户的输入事件。它相当于Android中Activity的onResume。
  • inactive – 应用程序处于闲置状态并且没有收到用户的输入事件。这个状态对Android来说是没用的,它只用于iOS。
  • paused – 应用程序处于不可见状态,并且不能够响应用户的输入事件。它相当于Android中Activity的onPause。
  • suspending – 应用程序将马上被挂起。这个状态对iOS来说没用。

下面的例子展示如何通过WidgetsBindingObserver来监听一个Widget的生命周期:

import 'package:flutter/widgets.dart';

class LifecycleWatcher extends StatefulWidget {
  @override
  _LifecycleWatcherState createState() => new _LifecycleWatcherState();
}

class _LifecycleWatcherState extends State<LifecycleWatcher> with WidgetsBindingObserver {
  AppLifecycleState _lastLifecyleState;

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    setState(() {
      _lastLifecyleState = state;
    });
  }

  @override
  Widget build(BuildContext context) {
    if (_lastLifecyleState == null)
      return new Text('This widget has not observed any lifecycle changes.', textDirection: TextDirection.ltr);
    return new Text('The most recent lifecycle state this widget observed was: $_lastLifecyleState.',
        textDirection: TextDirection.ltr);
  }
}

void main() {
  runApp(new Center(child: new LifecycleWatcher()));
}
复制代码

首先通过mixin(读作mix in,详情参阅 mixin )的方式扩展_LifecycleWatcherState类的功能,即在定义_LifecycleWatcherState类时使用关键字with来声明_LifecycleWatcherState类需要扩展WidgetsBindingObserver中的功能。这里的with其实可以简单类比到 Java 中的implements关键字,目的都是为了避免多继承带来的问题,但又同时想利用多继承的优点。

接着来看initState和dispose方法,它们是State类中提供的方法。它们其实本身也是两个生命周期的回调。 系统在State对象被创建好之后并且其对应的Widget已经被插入到Widget Tree中时调用initState方法。所以我们可以在initState方法中完成一些初始化的工作。比如这个例子我们在initState中就通过WidgetsBinding.instance获取到WidgetsBinding实例后调用其addObserver方法来注册一个WidgetsBindingObserver。 系统在State对象对应的Widget从Widget Tree中永久的删除后调用dispose方法。一个State对象调用dispose方法之后它被认为处于一个unmounted状态,这时候State对象的mounted属性值返回false。在这个时候去调用State的setState方法将触发一个错误。一个处于unmounted状态的State对象没法再回到remounted状态。所以我们可以在dispose方法中完成一些资源的释放工作,比如这个例子中我们就通过WidgetsBinding.instance获取到WidgetsBinding实例后调用其removeObserver方法来注销之前注册的WidgetsBindingObserver。

现在我们已经在initState中注册好了WidgetsBindingObserver,所以在Widget的生命周期发生变化时系统就会调用WidgetsBindingObserver的didChangeAppLifecycleState方法来通知我们,因此只要重写这个方法来实现我们在收到生命周期状态改变的通知时需要处理的逻辑就可以了。在这里就是简单的保存状态,并且通过setState方法触发界面刷新。

小结:在Flutter中除了State本身提供的生命周期回调方法initState和dispose外,还可以通过WidgetsBindingObserver类来帮助我们实现Widget生命周期的监听。具体使用方式是通过with关键字扩展WidgetsBindingObserver类来为我们定义的组件类提供监听生命周期的能力。

链接:https://tryenough.com

来源:TryEnough

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

热度: 2


以上所述就是小编给大家介绍的《Flutter 监听生命周期事件》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

网络传播学

网络传播学

吴风 / 中国广播电视出版社 / 2004-6-1 / 22.00元

本书把网络传播置于构型与解构的双重语境中,全面而深入地梳理了网络传播的概念、发展背景与现状、传播模式、传播物征、传播学意义,并从文化学、舆论学、政治学、心理学、符号学、法学、伦理学等视角,对网络传播对于国家民族进步、社会文明与个体发展等方面所带来的影响,作了理性审视。最后,作者指出网络传播在目前的新发展中,尚存在着侵犯个人隐私权、网络著作侵权、公共信息安全、网络色情、虚假信息等诸多的问题,对于这些......一起来看看 《网络传播学》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

SHA 加密
SHA 加密

SHA 加密工具

html转js在线工具
html转js在线工具

html转js在线工具