设为首页   china文化资讯门户欢迎您~!

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

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



前言

最近一直在用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复制代码

生命周期的总结

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

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

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学习视频



推荐阅读:苹果7p和苹果8
情趣用品 延时喷剂 女优名器 臀胸倒模 助勃增大 性保健品 ic商机网 光纤模块 谋幸福 情感图文 自慰器 爆笑男女 经典短信 轮胎 物流设备 我的酒 真空泵 征信系统 全球五金 我爱军事网 武汉家装网 行业报告 产业研究 文化资讯 健康网站 香哈网 时尚门户 民生热线 匛又匛知识门户网 时尚门户 求医问药 文化资讯 健康网站 香哈网 时尚门户 民生热线
http://www.xxmm888.com/article-44982.html http://www.xxmm888.com/article-35113.html http://www.xxmm888.com/article-39174.html http://www.xxmm888.com/article-34268.html http://www.xxmm888.com/article-46974.html http://www.xxmm888.com/article-33487.html http://www.xxmm888.com/article-33694.html http://www.xxmm888.com/article-2471.html http://www.xxmm888.com/article-40114.html http://www.xxmm888.com/article-25458.html http://www.xxmm888.com/article-23790.html http://www.xxmm888.com/article-18008.html http://www.xxmm888.com/article-46737.html http://www.xxmm888.com/article-38676.html http://www.xxmm888.com/article-32455.html http://www.xxmm888.com/article-31106.html http://www.xxmm888.com/article-32305.html http://www.xxmm888.com/article-21494.html http://www.xxmm888.com/article-23912.html http://www.xxmm888.com/article-3791.html