赞
踩
flutter组件只有两种:有状态和无状态组件。由于无状态组件效率高,如果不涉及到组件内部的数据存储,尽量多的使用无状态组件
调用次数:1次
StatelessWidget是无状态组件,生命周期只有一个build方法,很简单
flutter生命周期大体上可以分为三个阶段:初始化、状态变化、销毁。
调用次数:1次
调用次数:1次
在创建一个新的StatefulWidget,会首先调用这个方法, 这个生命周期是必须有的。
class LifeScreen extends StatefulWidget {
LifeScreen({Key key}) : super(key: key);
@override
_LifeScreenState createState() => _LifeScreenState();
}
调用次数:1次
这个生命周期是在该节点创建后调用的第一个方法。插入渲染树时调用,只调用一次,widget创建执行的第一个方法,这里可以做一些初始化工作,比如初始化State的变量。
只是一个值,不是方法
所有的节点都会有这个属性,在buildContext被赋值并且该节点已经在节点树(the widget tree)上的时候,这个属性的值会变成true。然后该属性会一直保持true,直到dispose的方法被调用后会变成false.
这个需要在initState() 内被调用,示例如下:
import 'package:flutter/scheduler.dart';
@override
void initState() {
super.initState();
SchedulerBinding.instance.addPostFrameCallback((_) => {});
}
这个是在每一帧渲染完成后的回调,只有在该节点构建(build)完成后调用一次。
调用次数:多次
widget树中,若节点的父级结构中的层级 或 父级结构中的任一节点的widget类型有变化,节点会调用didChangeDependencies;若仅仅是父级结构某一节点的widget的某些属性值变化,节点不会调用didChangeDependencies
调用次数:多次
调用次数:多次
widget树中,若节点调用setState方法,节点本身不会触发didUpdateWidget,此节点的子节点 会 调用didUpdateWidget
当State对象从树中被移除时,会调用此回调,会在dispose之前调用。
页面销毁的时候会依次执行:deactivate > dispose
调用次数:1次
在deactivate()之后调用,当State对象从树中被永久移除时调用;通常在此回调中释放资源。
在这个生命周期里需要取消订阅(unsubscribe) streams和回收动画(dispose animations)等等,避免内存泄漏。
调用次数:多次
在热重载(hot reload)时会被调用,此回调在Release模式下永远不会被调用。
原因是
开发阶段:JIT (Just-in-Time,即时编译),使用了jvm。
打包使用:AOT (Ahead-of-Time,预编译),使用so库直接运行。
通过WidgetsBindingObserver的didChangeAppLifecycleState 来获取。通过该接口可以获取是生命周期在AppLifecycleState类中。
示例:
class LoginTestPage extends StatefulWidget { @override State<StatefulWidget> createState() { // TODO: implement createState return _LoginTestPageState(); } } class _LoginTestPageState extends State<LoginTestPage> with WidgetsBindingObserver { @override void initState() { // TODO: implement initState super.initState(); } @override void didChangeAppLifecycleState(AppLifecycleState state) async { print("--" + state.toString()); switch (state) { case AppLifecycleState.inactive: // 处于这种状态的应用程序应该假设它们可能在任何时候暂停。 break; case AppLifecycleState.resumed: {} // 应用程序可见,前台 break; case AppLifecycleState.paused: // 应用程序不可见,后台 break; case AppLifecycleState.detached: // TODO: Handle this case. break; } } @override Widget build(BuildContext context) { // TODO: implement build return Container(); } }
可见并能响应用户的输入,同安卓的onResume
处在并不活动状态,无法处理用户响应,同安卓的onPause
不可见并不能响应用户的输入,但是在后台继续活动中,同安卓的onStop
初次打开widget时,不执行AppLifecycleState的回调;
按home键或Power键, AppLifecycleState inactive---->AppLifecycleState pause
从后台到前台:AppLifecycleState inactive—>ApplifecycleState resumed
back键退出应用: AppLifecycleState inactive—>AppLifecycleState paused
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。