Flutter 监听生命周期事件

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

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

查看所有标签

猜你喜欢:

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

Cypherpunks

Cypherpunks

Julian Assange、Jacob Appelbaum、Andy Müller-Maguhn、Jérémie Zimmermann / OR Books / 2012-11 / GBP 8.99

Cypherpunks are activists who advocate the widespread use of strong cryptography (writing in code) as a route to progressive change. Julian Assange, the editor-in-chief of and visionary behind WikiLea......一起来看看 《Cypherpunks》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具