StatelessWidget和StatefulWidget是flutter的基础组件,日常开发中自定义Widget都是选择继承这两者之一。

两者的区别在于状态的改变,StatelessWidget面向那些始终不变的UI控件,比如标题栏中的标题;而StatefulWidget则是面向可能会改变UI状态的控件,比如有点击反馈的按钮。

StatefulWidget的创建需要指定一个State,在需要更新UI的时候调用setState(VoidCallback fn),并在VoidCallback中改变一些变量数值等,组件会重新build以达到刷新状态也就是刷新UI的效果。

State生命周期

class _CounterWidgetState extends State<CounterWidget> {  int _counter;@overridevoid initState() {super.initState();//初始化状态  _counter=widget.initValue;print("initState");}@overrideWidget build(BuildContext context) {print("build");return Scaffold(body: Center(child: FlatButton(child: Text('$_counter'),//点击后计数器自增onPressed:()=>setState(()=> ++_counter,),),),);}@overridevoid didUpdateWidget(CounterWidget oldWidget) {super.didUpdateWidget(oldWidget);print("didUpdateWidget");}@overridevoid deactivate() {super.deactivate();print("deactive");}@overridevoid dispose() {super.dispose();print("dispose");}@overridevoid reassemble() {super.reassemble();print("reassemble");}@overridevoid didChangeDependencies() {super.didChangeDependencies();print("didChangeDependencies");}
}

函数解析

  • initState:当Widget第一次插入到Widget树时会被调用,对于每一个State对象,Flutter framework只会调用一次该回调,所以,通常在该回调中做一些一次性的操作,如状态初始化、订阅子树的事件通知等。不能在该回调中调用BuildContext.inheritFromWidgetOfExactType(该方法用于在Widget树上获取离当前widget最近的一个父级InheritFromWidget,关于InheritedWidget我们将在后面章节介绍),原因是在初始化完成后,Widget树中的InheritFromWidget也可能会发生变化,所以正确的做法应该在在build()方法或didChangeDependencies()中调用它。

  • didChangeDependencies():当State对象的依赖发生变化时会被调用;例如:在之前build() 中包含了一个InheritedWidget,然后在之后的build() 中InheritedWidget发生了变化,那么此时InheritedWidget的子widget的didChangeDependencies()回调都会被调用。典型的场景是当系统语言Locale或应用主题改变时,Flutter framework会通知widget调用此回调

  • build():此回调读者现在应该已经相当熟悉了,它主要是用于构建Widget子树的,会在如下场景被调用:
    1.在调用initState()之后。
    2.在调用didUpdateWidget()之后。
    3.在调用setState()之后。
    4.在调用didChangeDependencies()之后。
    5.在State对象从树中一个位置移除后(会调用deactivate)又重新插入到树的其它位置之后。

  • reassemble():此回调是专门为了开发调试而提供的,在热重载(hot reload)时会被调用,此回调在Release模式下永远不会被调用。

  • didUpdateWidget():在widget重新构建时,Flutter framework会调用Widget.canUpdate来检测Widget树中同一位置的新旧节点,然后决定是否需要更新,如果Widget.canUpdate返回true则会调用此回调。正如之前所述,Widget.canUpdate会在新旧widget的key和runtimeType同时相等时会返回true,也就是说在在新旧widget的key和runtimeType同时相等时didUpdateWidget()就会被调用。

  • deactivate():当State对象从树中被移除时,会调用此回调。在一些场景下,Flutter framework会将State对象重新插到树中,如包含此State对象的子树在树的一个位置移动到另一个位置时(可以通过GlobalKey来实现)。如果移除后没有重新插入到树中则紧接着会调用dispose()方法。

  • dispose():当State对象从树中被永久移除时调用;通常在此回调中释放资源。

Widget中的一些基本概念相关推荐

  1. 【C#小知识】C#中一些易混淆概念总结(三)---------结构,GC,静态成员,静态类...

    目录: [C#小知识]C#中一些易混淆概念总结 [C#小知识]C#中一些易混淆概念总结(二) ---------------------------------------分割线----------- ...

  2. 9 单元测试中不得不知的概念

    单元测试中不得不知的概念 前言 软件单元及单元测试 驱动函数和桩函数 总结 前言 做单元测试,如果不弄清楚什么是单元,那十八般武器也无的放矢了.可能在单元测试中听到最多的就是驱动函数.桩函数和逻辑覆盖 ...

  3. 【C#小知识】C#中一些易混淆概念总结(七)---------解析抽象类,抽象方法

    目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...

  4. C++中继承的基本概念

    文章目录 1 C++中继承的基本概念 1.1 继承的基本概念 1.2 继承的意义 1.3 继承实例分析 1 C++中继承的基本概念 1.1 继承的基本概念 继承关系就是父子关系,UML图如下: 注意是 ...

  5. Android Widget 中ListView加载网络图片

    为什么80%的码农都做不了架构师?>>>    关于Widget的介绍和用法可以看这两篇博文,写的非常详细了 Android 之窗口小部件详解--App Widget http:// ...

  6. java中容易混淆的方法_java中容易混淆的概念

    java中容易混淆的概念 1. 谈谈 final, finally, finalize 的区别final-修饰符(关键字)如果一个类被声明为 final,意味着它不能再派生出新的子类,不 能作为父类被 ...

  7. java中接口文件创建_功能接口简介–在Java 8中重新创建的概念

    java中接口文件创建 世界各地的所有Java开发人员都将至少使用以下接口之一:java.lang.Runnable,java.awt.event.ActionListener,java.util.C ...

  8. 功能接口简介–在Java 8中重新创建的概念

    世界各地的所有Java开发人员都将至少使用以下接口之一:java.lang.Runnable,java.awt.event.ActionListener,java.util.Comparator,ja ...

  9. python画海绵宝宝_《1,2,3到动物园》数数书,适合幼儿园小班宝宝亲子共读,从游戏中了解数字的概念...

    大家好,我是神桐妈妈,最近开始陆续给几个幼儿园做了有关绘本方面的师资培训,然后又有新的幼儿园要有了嵌入式幼儿园绘本馆,有了绘本,有了书香氛围,又有孩子们开始接触绘本,每天拿着一本绘本带回家,和爸爸或者 ...

最新文章

  1. linux如何编译tex,Linux下优秀的文本编辑器(Markdown、LaTeX、MathJax)
  2. 添加/移除事件处理程序
  3. 10个节约开发时间的CSS技巧
  4. JDK collections - 使用
  5. java中重载构造方法的例程_Java构造函数使用多种方法重载
  6. windows10连接共享打印机报错:错误 0x00000709 解决方法
  7. 神策分析 1.13 版本用户分群全新升级,为企业打磨­­­­­­­­­精细化运营基石
  8. html网站计数器代码,如何在网站添加计数器代码
  9. 微信小程序-中英文文本换行的小问题
  10. 第二章.物理层:2.6宽带接入技术
  11. Loadrunner事务与子事务函数简介
  12. 浙江众源自控系统有限公司亮相2022生物发酵展(济南)7月14日与您相约
  13. 企业微信小程序获取手机号?
  14. APS系统在纺织行业的应用
  15. 【网络原理】知识点汇总2
  16. 通过无线网络实现两台计算机共享打印机共享,教你两招实现无线网络共享打印机...
  17. GhostXP_SP2电脑公司特别版_5.5
  18. JAVA基本框架搭建(Maven,jetty,Jod…
  19. 黑塔互联网分享——零基础入门UI
  20. VS2022安装教程

热门文章

  1. 绝对中位差( Median Absolute Deviation,MAD)算法
  2. 100道Java高频面试题(阿里面试官整理)
  3. ROK 万国觉醒2D资源分析
  4. 【转】Zcash 网络升级 Sapling 简介
  5. 时空弯曲是必须的吗?
  6. Peak prominences(峰日珥)
  7. 为什么这些照片连最强大的视觉AI也无法准确识别?
  8. Fractal解题笔记
  9. 二十种题型带你复习《概率论与数理统计》得高分(高数叔)
  10. 【论文分享】一个用于现代cpu的多正则表达式匹配器:Hyperscan: A Fast Multi-pattern Regex Matcher for Modern CPUs