本篇主要介绍Flutter中的相关生命周期 分为 widget生命周期、app生命周期html
flutter中widget主要分为 StatelessWidget 和 StatefulWidget 两种 两者生命周期不太同样app
若是一个控件自身状态不会去改变,建立了就直接显示,不会有色值、大小或者其余属性的变化,这种widget通常都是继承自StatelessWidget,常见的有Container、ScrollView等,生命周期只有 buildless
class Frog extends StatelessWidget {
const Frog({ Key key }) : super(key: key);
@override
Widget build(BuildContext context) {
return new Container(color: const Color(0xFF2DBD3A));
}
}
复制代码
build是用来建立widget的,可是由于build在每次刷新时候都会调用,一般须要把业务逻辑写到构造函数中ide
须要持有状态 State,这里面包含了一系列生命周期方法函数
class YellowBird extends StatefulWidget {
const YellowBird({ Key key }) : super(key: key);
@override
_YellowBirdState createState() => new _YellowBirdState();
}
class _YellowBirdState extends State<YellowBird> {
@override
Widget build(BuildContext context) {
return new Container(color: const Color(0xFFFFE306));
}
}
复制代码
官网示意图以下
动画
在网上看到一个更加下详细的ui
大体能够划分3个阶段:this
构造函数 > initState > didChangeDependencies > Widget build , 此时页面加载完成。spa
组件移除,例如页面销毁的时候会依次执行:deactivate > dispose.net
名称 | 描述 | 调用次数 |
---|---|---|
createState | createState 是 StatefulWidget 里建立 State 的方法,当要建立新的 StatefulWidget 的时候,会当即执行 createState,并且只执行一次 | 1次 |
initState | initState 是 StatefulWidget 建立完后调用的第一个方法,并且只执行一次,相似于 Android 的 onCreate、iOS 的 viewDidLoad(),因此在这里 View 并无渲染,可是这时 StatefulWidget 已经被加载到渲染树里了,这时 StatefulWidget 的 mount的值会变为 true,直到 dispose调用的时候才会变为 false。能够在 initState里作一些初始化的操做。 | 1次 |
didChangeDependencies | 一、当 StatefulWidget 第一次建立的时候,didChangeDependencies方法会在 initState方法以后当即调用,以后当 StatefulWidget 刷新的时候,就不会调用了, 二、或者你的 StatefulWidget 依赖的 InheritedWidget 发生变化以后,didChangeDependencies才会调用,因此 didChangeDependencies有可能会被调用屡次。 |
1次或屡次 |
build | 在 StatefulWidget 第一次建立的时候,build方法会在 didChangeDependencies方法以后当即调用,另一种会调用 build方法的场景是,每当 UI 须要从新渲染的时候(setState触发),build都会被调用,因此 build会被屡次调用,而后 返回要渲染的 Widget。千万不要在 build里作除了建立 Widget 以外的操做,由于这个会影响 UI 的渲染效率 | 屡次 |
didUpdateWidget | 祖先节点rebuild widget时调用,当组件改变状态时就会调用, 须要注意的是,涉及到controller的变动,须要在这个函数中移除老的controller的监听,并建立新controller的监听。 |
1次或屡次 |
deactivate | 当要将 State 对象从渲染树中移除的时候,就会调用 deactivate生命周期,这标志着 StatefulWidget 将要销毁,可是有时候 State 不会被销毁,而是从新插入到渲染树种 | 1次或屡次 |
dispose | 当 View 不须要再显示,从渲染树中移除的时候,State 就会永久的从渲染树中移除,就会调用 dispose生命周期,这时候就能够在 dispose里作一些取消监听、动画的操做,和 initState是相反的 | 1次 |
这里补充一个,**addPostFrameCallback,**是 StatefulWidge 渲染结束的回调,只会被调用一次,以后 StatefulWidget 须要刷新 UI 也不会被调用,addPostFrameCallback的使用方法是在 initState里添加回调:
import 'package:flutter/scheduler.dart';
@override
void initState() {
super.initState();
SchedulerBinding.instance.addPostFrameCallback((_) => {});
}
复制代码
在 window.dart中有枚举类 AppLifecycleState
enum AppLifecycleState {
resumed,
inactive,
paused,
suspending,
}
复制代码
若是想要知道Flutter App的生命周期,好比前台、后台就须要使用**WidgetsBindingObserver **使用方法以下
State的类mix WidgetsBindingObserver,覆写didChangeAppLifecycleState
class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
@override
void initState(){
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
// TODO: implement dispose
super.dispose();
WidgetsBinding.instance.removeObserver(this);
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
if (state == AppLifecycleState.paused) {
// went to Background
}
if (state == AppLifecycleState.resumed) {
// came back to Foreground
}
}
}
复制代码