设为首页   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商机网 光纤模块 情感图文 酒网 飞机杯 延时喷剂 女优名器 臀胸倒模 助勃增大 充气娃娃 锁精套环 前列腺 实体玩偶 女性用品 按摩棒 仿真阳具 转珠棒 G点震动棒 性爱机器 跳蛋 AV震动棒 双乳刺激 后庭拉珠 充气男人 私处挑逗 情趣服饰 性感裙装 情趣内裤 三点激情 连体网衣 情趣丝袜 制服诱惑 双人情趣 男女共震 同性用品 SM套装 调教工具 乳夹口塞 体位道具 后庭肛塞 贞操裤 助情保健 延时喷剂 女用催欲 催情香水 润滑液 人体润滑 唇吸润滑 后庭润滑 防过敏 玩具清洗 避孕套 超薄体贴 创意时尚 冰火果味 浮点颗粒 超凡持久 螺纹刺激 超值组合 丰胸缩阴 缩阴养颜 丰胸美胸 私处护理 成人用品排行 火爆情趣内衣 火爆延时喷剂 女性仿真倒模 女用自慰器 飞机杯自慰器 男根增大 能否给我个家 男性用品 女性用品 助情保健 情趣内衣 飞机杯 仿真阳具 双人情趣 震动棒