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 监听生命周期事件》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Web协议与实践

Web协议与实践

克里希纳穆尔蒂 (KrishnamurthyBalachander) / 范群波 / 科学出版社 / 2003-7 / 46.0

本书全面论述了传输Web内容的系统和协议,重点讲述了Web中业已成熟和稳定的技术,如TCP/IP协议及DNS技术、HITP/1.0的设计及其与TCP之间的交互;深入阐述了Web高速缓存技术和多媒体流播技术的最新技术动态;分析了Apache Web服务器和Squid代理;还探讨了通信量的分析和测量技术。书中使用了大量示例、技术发展水平报告以及案例分析来阐述Web的工作原理和各个组件之间的交互。本书是......一起来看看 《Web协议与实践》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换