第一次看文章的朋友可以关注我和我的专栏,会不定期发布大厂面试题、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学习视频
推荐阅读:新疆信息港
-
年终岁末好礼多 京东年货节买三星Galaxy
目前,京东年货节正在如火如荼的进行中,对于消费者而言,趁着年货节入手心仪已久电子产品相信是再好不过了。为了让消费者更方便快速的抢购年货好物,各大厂商在京东年货节...
2020-01-13 -
姑娘们对口红色号、香水味的执念,让一家美妆公
当市场极速增长时,从行业巨头的转身过程中,传统企业能学到什么?难以想像,「科技」这个有些划分年龄意义的符号,最早被带入欧莱雅集团却是从一个头发花白的人那里。去年...
2019-10-17 -
如今的年轻人连挑一辆家用车的口味的都变了
自从有了娃,就愈发觉得买车和生娃其实是一个事,不能只图一时之爽,更要为日后的长远的“奶粉钱”做好充足的准备。如果你打算在15万这个区间内挑一辆家(mǎi)用(c...
2019-10-17 -
「美食拍摄技巧」美食摄影网站及美食摄影APP
关于手机美食摄影,在前面四篇文章中,我们系统地讲了手机美食摄影知识及拍摄技巧等内容。相信大家对手机美食摄影已经有了一个基本的认识并学到了一定的相关知识与技巧。那...
2019-10-17 -
外贸企业发力拓展市场“中国制造”加快海外布局
广交会成为中国企业展现品牌创新能力的最佳平台 记者 宋金峪 摄126届广交会“一带一路”互利共赢带来强劲商机金羊网记者 马汉青 陈泽云“沿线市场基建发展很快,前...
2019-10-17 -
广东遭遇官方“吐槽”:你太南了
这几天,在冷空气的影响下北方大部地区气温低迷东北、华北等多地气温创下今年下半年来新低青藏高原到东北一带已“触底”气温图例标尺最深色冻得“发黑”了就在北方被冻得发...
2019-10-17 -
半亩花田缘何成为身体护理品类的黑马?
近年来,在新国潮、Z世代、社交媒体“三驾马车”的驱动下,线上涌现出了一大批新国货品牌,完美日记、Home Facial Pro、花西子、WIS等等。半亩花田也是...
2019-10-17 -
妆闻天下日报:强生第三季度营收超预期/以及更
强生第三季度营收超出预期,消费部门营收245.5亿元周二(10月15日),强生公司公布了第三季度财报,第三季度营收207.3亿美元(约合人民币1470.5亿元)...
2019-10-17