您的位置: 人民信息网 > 消费 > 正文

用Flutter做APP学习心得:Flutter widget的生命周期!

2020-11-19 09:57:25来源:阅读:-

第一次看文章的朋友可以关注我和我的专栏,会不定期发布大厂面试题、Android架构技术知识点及解析等内容,还有Android学习PDF+源码笔记+面试文档+进阶视频分享。



用Flutter做APP学习心得:Flutter widget的生命周期

前言

最近一直在用flutter做app,感觉就像用vue或react写web页面一样,蛮好玩的。为了加深自己对Flutter的理解,记录一下自己的学习心得。

Widget、StatefulWidget、StatelessWidget

看源码就知道这三者的关系了,代码如下:

abstract class Widget extends DiagnosticableTree {  const Widget({ this.key });  final Key key;  @protected  Element createElement();  static bool canUpdate(Widget oldWidget, Widget newWidget) {    return oldWidget.runtimeType == newWidget.runtimeType        && oldWidget.key == newWidget.key;  }  }abstract class StatelessWidget extends Widget {  const StatelessWidget({ Key key }) : super(key: key);  @override  StatelessElement createElement() => StatelessElement(this);  @protected  Widget build(BuildContext context);  }abstract class StatefulWidget extends Widget {  const StatefulWidget({ Key key }) : super(key: key);  @override  createElement() => StatefulElement(this);  @protected  State createState();}复制代码

StatelessWidget没有状态,可以类比react中的傻瓜组件;

StatefulWidget有状态,状态存在State对象中;所以一般说的生命周期都是指的是State的生命周期;

abstract class State extends Diagnosticable {  void initState() { }  void didChangeDependencies() { }  Widget build(BuildContext context);  void setState(VoidCallback fn) {}  void deactivate() { }  void dispose() { }  void reassemble() { }  void didUpdateWidget(covariant T oldWidget) { }}复制代码

现象

为了验证State的生命周期,我的操作是从Home->page1->page2->page1->Home

从Home->page1,这是初始化的过程

I/flutter ( 4980): [debug],[lifeCycle], initStateI/flutter ( 4980): [debug],[lifeCycle], didChangeDependenciesI/flutter ( 4980): [debug],[lifeCycle], build复制代码

从page1->page2,相当于page1被暂时移出

I/flutter ( 4980): [debug],[lifeCycle], deactivateI/flutter ( 4980): [debug],[lifeCycle], didChangeDependenciesI/flutter ( 4980): [debug],[lifeCycle], build复制代码

从page2->page1,相当于page1又被移回来了

I/flutter ( 4980): [debug],[lifeCycle], deactivateI/flutter ( 4980): [debug],[lifeCycle], didChangeDependenciesI/flutter ( 4980): [debug],[lifeCycle], build复制代码

从page1->Home,相当于page1被删除

I/flutter ( 4980): [debug],[lifeCycle], deactivateI/flutter ( 4980): [debug],[lifeCycle], dispose复制代码

生命周期的总结

直接看图,应该很清晰了,

用Flutter做APP学习心得:Flutter widget的生命周期

上述的生命周期,有两个地方需要重点理解:

1. state对象的依赖发生变化时,这是当state中通过InheritedWidget使用了父级widget的共享数据,当数据变化的时候,就会调用子widget的didChangeDependencies()

2. widget重新构建时,会调用state的didUpdateWidget();首先要知道,每个StatefulWidget都有一个state对应; 当widget重新构建的时候,会先调用widget的canUpdate方法来判断是否需要更新;如果 key与runtimeType都一样的,会返回true,表示可以对widget进行更新,从而调用state的didUpdateWidget();如果 key或runtimeType不一样的时候,那就没必要更新,直接删除旧的,创建个新的就可以了。

疑问

在尝试的时候,有个现象,当widget页面在可见到不可见之间切换的时候,调用的方法都是一样的,都是deativate->didChangeDependencies->build;这里有个疑问,既然都已经不可见了为啥还要build?或者说都build了为啥还能不可见?

这个疑问应该需要进一步挖掘Flutter的widget、element、render树的关系,等俺进一步理解了Flutter UI原理后再来分享哈

最后

现在,很多公司的项目已经上flutter,还有些公司在上flutter的路上

学习要先人一步,关注我,私信【安卓】领取flutter学习视频


用Flutter做APP学习心得:Flutter widget的生命周期


用Flutter做APP学习心得:Flutter widget的生命周期

推荐阅读:每日时讯网

滚动推荐
57:25用Flutter做APP学习心得:
I/flutter: [debug],[lifeCycle], dis[详细]
29:42一根滚烫的电话专线:我想捐鸡蛋、红
疫情来临的时候,更是见证人情温暖的时刻,来自每一个角落的中国人,都想为[详细]
18:13对京东天猫电商渠道的误解,让一些家
就是一个低价卖货的渠道,这是很多家电厂商对于电商渠道的误解和偏见。家电[详细]
13:43圣象37℃地板伴侣,享受智能恒温的
圣象37℃智控温电地暖人性化的智控温系统,选用了有线及无线遥控温度控制[详细]
52:16甘肃定做买菜app需要开发哪些功能
对着移动生鲜电商的崛起、发展和拼杀,越来越多的生鲜企业纷纷定做app,[详细]
44:49360杀毒软件与统一操作系统UOS
36氪获悉,统信软件方面表示,近日,云安全杀毒软件——360杀毒软件与[详细]
44:37特斯拉股价一年内暴涨500%,背后
第六点,Model 3与酷炫皮卡的陆续出台 而2020年开始的暴涨,主[详细]