而StatefulWidget,还需要借助其State对象,在特定阶段来处理用户的交互或其内部数据的变化,并体现在UI上。这些特定的阶段,就涵盖了一个组件从加载到卸载的全过程,即生命周期。...可以看到,State的生命周期可以分为三个阶段:创建(插入视图树)、更新(在视图树中存在)、销毁(从视图树中移除)。接下来我们一起看看每一个阶段的具体流程。...我们可以通过初始化方法,接收父Widget传递过来的初始化UI配置参数,这些配置参数决定了Widget的最初配置效果 initState,会在State对象被插入视图树的时候调用,这个函数在State的生命周期中只会被调用一次...在原生iOS、Android开发中,有时我们需要在对应的App生命周期事件中做相应处理,比如APP从后台进入前台、从前台退到后台,或是在UI绘制完成后做一些处理。...在下面的代码中,我们在 initState 时注册了监听器,在 didChangeAppLifecycleState 中打印了当前的App状态,最后在 dispose 时把监听器移除: class _
1.2.2 生命周期二:initState initState 函数在组件被插入树中时被 Framework 调用(在 createState 之后),此函数只会被调用一次,子类通常会重写此方法,在其中进行初始化操作...此方法可以在每一帧中调用,此方法中应该只包含构建组件的代码,不应该包含其他额外的功能,尤其是耗时任务。...1.2.6 生命周期六:deactivate 当框架从树中移除此 State 对象时将会调用此方法,在某些情况下,框架将重新插入 State 对象到树的其他位置(例如,如果包含该树的子树 State 对象从树中的一个位置移植到另一位置...因为如果当前组件未插入到树中或者已经从树中移除时,调用 setState 会抛出异常,加上 mounted 判断,则表示当前组件在树中。...处于此状态的时机:引擎首次加载到附加到一个平台 View的过程中,或者由于执行 Navigator pop ,view 被销毁。
Widget 的一生 —— initState、build 与 dispose 全解析 在上一篇中,我们正式迈入了 Flutter 的核心领域: StatefulWidget State setState...在真实 App 中,你一定会遇到: 页面初始化时请求数据 页面进入时启动动画 页面离开时关闭定时器 页面销毁时释放资源 这些事情,都和 Widget 生命周期 有关。...只调用一次 在页面第一次 build 之前 State 创建完成后立即调用 记住一句话: initState 只会执行一次 2️⃣ 常见用途 初始化变量 请求接口数据 启动动画 初始化控制器(Controller...页面被移除 State 即将销毁 只调用一次 2️⃣ 常见用途 关闭定时器 释放动画控制器 关闭 Stream 清理资源 3️⃣ 基本写法 @override void dispose() { print...九、新手最常见的 5 个坑 ❌ 在 build 里请求接口 ❌ 在 initState 里用 context 做复杂操作 ❌ 忘记调用 super ❌ 不释放资源 ❌ 以为 build 只执行一次 十、
生命周期二:initState 「initState」 函数在组件被插入树中时被 Framework 调用(在 「createState」 之后),此函数只会被调用一次,子类通常会重写此方法,在其中进行初始化操作...此方法可以在每一帧中调用,此方法中应该只包含构建组件的代码,不应该包含其他额外的功能,尤其是耗时任务。...生命周期六:deactivate 当框架从树中移除此 State 对象时将会调用此方法,在某些情况下,框架将重新插入 State 对象到树的其他位置(例如,如果包含该树的子树 State 对象从树中的一个位置移植到另一位置...因为如果当前组件未插入到树中或者已经从树中移除时,调用 「setState」 会抛出异常,加上 「mounted」 判断,则表示当前组件在树中。...处于此状态的时机:引擎首次加载到附加到一个平台 View的过程中,或者由于执行 Navigator pop ,view 被销毁。
initState 初始化 当此对象插入树中时调用,框架会调用一次此方法并不会再次重复执行, 如果[State]的[build]方法依赖于本身可以更改状态的对象,例如[ChangeNotifier]或[...State对象从树中一个位置移除后会调用deactivate,然后又重新插入到树的其它位置之后。...会调用Widget.canUpdate来检测Widget树中同一位置的新旧节点, 然后决定是否需要更新,如果Widget.canUpdate返回true则会调用此回调。...正如之前所述,Widget.canUpdate会在 新旧widget的key和runtimeType同时相等时会返回true,也就是说在新旧widget的key和runtimeType同时相等时didUpdateWidget...deactivate 暂停 State对象从树中被移除时(在dispose之前),会调用这个函数来将对象暂停。 dispose 销毁 当State对象被销毁时调用,通常在此回调中释放资源和移除监听。
StatelessWidgets and StatefulWidgets Flutter中的Widget都必须从Flutter库中继承。...Container - 在Flutter中,相当于div。允许在其中进行添加填充,对齐,背景,力大小以及其他东西的加载。空的时候也会占用0px的空间,这很方便。....` to make sure the State exists before calling `setState() 3 . initState() 这个方法只会调用一次,在这个Widget被创建之后...在这里可以做: 初始化根据对应BuildContext的状态 初始化根据在树上的父节点的属性确定的值 注册Streams ChangeNotifiers或者其他会改变的数据的监听。...此方法的存在主要是因为State对象可以从树中的一个点移动到另一个点。 这很少使用。 9. dispose() State删除对象时调用Dispose ,这是永久性的。
写在前面在 Flutter 开发中,处理异步请求是常见的需求,例如从网络获取数据。理解如何在 initState 中触发异步请求,并在请求完成时使用 setState 更新 UI 是非常重要的。...在这篇博客中,我们将深入探讨如何在 initState 中执行异步请求,并安全地使用 mounted 属性确保在适当的时机更新状态。...1. initState 方法概述initState 是一个生命周期方法,当 State 对象被插入到树中时会调用它。这个方法通常用于初始化一些状态,如加载数据、设置定时器等。...它在 State 对象被插入到树中时为 true,在被从树中移除时为 false。在执行异步请求时,尤其是当请求时间较长时,可能会出现 setState 被调用时对象已被卸载的情况。...为了避免这种情况,我们可以通过检查 mounted 来确保我们只在组件仍然存在时更新 UI。
在 Flutter 中几乎所有的对象都是一个 Widget,其中 Widget 又分为 StatelessWidget(即:无状态的 Widget) 和 StatefulWidget (即:有状态的 Widget...initState 初始化: 当此对象插入树中时调用,框架会调用一次此方法并不会再次重复执行, 如果 State 的 build 方法依赖于本身可以更改状态的对象,例如:ChangeNotifier...State 对象从树中一个位置移除后会调用 deactivate,然后又重新插入到树的其它位置之后。...deactivate 暂停: State 对象从树中被移除时(在 dispose 之前),会调用这个函数来将对象暂停。...dispose 销毁: 当 State 对象被销毁时调用,通常在此回调中释放资源和移除监听。
题记 —— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天。...= null; StatefulElement 的创建 是在 回调 initState方法 之前,如下代码清单1-3 中所示,StatefulElement 继承于 ComponentElement,在父类...ComponentElement的构造函数中给 变量 _element 赋值, 所以在 实际开发中,在 Widget 的 initState 方法中 获取的 mounted 值为 true , State...当 Widget 被 移除时 ,通过 Navigator 的 pop 或者 是在具体的 build 方法中通过变量控制将一个已在页面上渲染显示出来的Widget 移除不显示时,这个 Widget 对应的状态...当解绑后 回调 dispose ,此时对应的 Element 已被 移除,为null ,所以 此时 被移除的 Widget中的 mounted 值为 false, 当然在这里 context 也是肯定不能使用的
是有状态的组建在更新构建过程上会有一点稍微的不同,今天我们就来看下StatefulWidget是如何更新Widget,以及它是如何触发界面变更的。...运行中:在渲染树中存在,这一阶段涉及的生命周期函数主要有didUpdateWidget和build。 销毁:从渲染树中移除,此阶段涉及的生命周期函数主要有deactivate和dispose。...dispose 1 state对象被销毁 通常情况下,我们可以在initState方法中做一些初始化工作,然后在dispose方法中做一些销毁工作。...setState如何触发界面变更 在前面很多例子中我们多次使用到setState方法,来更新Element中的数据,每次当每次数据变更时我们触发setState方法,紧接着界面就跟着变化了,大家应该都知道这是...在开始了解setState方法之前我们还需要来了解下一个枚举类_StateLifecycle,它是flutter中的一个私有类,用来表示State的生命周期。
initState 函数 : 所处时期 : 初始化期的生命周期函数 调用时机 : 该方法是创建 Widget 组件时除构造方法之外的第一个方法 , 对应方法 : 对应 Android 中的 onCreate...方法 ; 对应 iOS 中的 viewDidLoad 方法 ; 常用用法 : 在该方法中执行一些初始化操作 ; /// 2....方法 /// 常用用法 : 在该方法中执行一些初始化操作 @override void initState() { print("initState"); super.initState...销毁期的生命周期函数 /// 方法调用时机 : 该生命周期方法不经常调用 , 只有在组件被移除时才调用 /// 该方法在 dispose 方法之前被调用 @override void deactivate...方法 /// 常用用法 : 在该方法中执行一些初始化操作 @override void initState() { print("initState"); super.initState
从flutter的入口main方法开始,一步步看下widget是如何被加载的 在Flutter中,一切皆widget,我们有两大widget,statelessWidget和stetefulWidge,...会分别看两种下widget是如何被加载出来的,展示的源码会有删减,仅展示跟主题有关的代码 入口到加载 flutter的入口,就是runApp方法,我们也从这个方法开始查看 void main() {...的build方法,就是我们每次实现widget都要实现的方法,然后又调用updateChild方法,继续加载这个widget的子widget,一直循环下去,直到全部加载完 class StatelessElement...4、didChangeDependencies 5、build 这里的生命周期是只到加载出来,后续还有更新、销毁等,这里先不提 总结 1、widget的所有方法,都是在同个线程按照从外层到内层逐级往里调用...,也就是主线程,dart中叫main isolate 2、如果在widget中,有耗时的方法,应该放在异步执行,可以使用compute,或者isolate提供的异步方法 3、widget的目的,其实是为了生成对应的
的生命周期流程如下图所示 file 由图可知:State 的生命周期可以分为三个阶段:创建(插入视图树)、更新(在视图树中存在)、销毁(从视图树中移除) 创建 ...可以通过构造方法,来接收父 Widget 传递的初始化 UI 配置数据,而这些配置数据,决定了 Widget 最初的呈现状态 initState:在 State 对象被插入视图树时调用。...在 State 的生命周期中只会被调用一次,因此可以在 initState 函数中做一些初始化操作 didChangeDependencies:专门用来处理 State 对象依赖关系变化,会在...会被暂时从视图树中移除。...注意:页面切换时,由于 State 对象在视图树中的位置发生了变化,需要先暂时移除后再重新添加,重新触发组件构建,因此也会调用 deactivate 方法 当 State 被永久地从视图树中移除时
生命周期二:initState initState 函数在组件被插入树中时被 Framework 调用(在 createState 之后),此函数只会被调用一次,子类通常会重写此方法,在其中进行初始化操作...此方法可以在每一帧中调用,此方法中应该只包含构建组件的代码,不应该包含其他额外的功能,尤其是耗时任务。...生命周期六:deactivate 当框架从树中移除此 State 对象时将会调用此方法,在某些情况下,框架将重新插入 State 对象到树的其他位置(例如,如果包含该树的子树 State 对象从树中的一个位置移植到另一位置...生命周期七:dispose 当框架从树中永久移除此 State 对象时将会调用此方法,与 deactivate 的区别是,deactivate 还可以重新插入到树中,而 dispose 表示此 State...因为如果当前组件未插入到树中或者已经从树中移除时,调用 setState 会抛出异常,加上 mounted 判断,则表示当前组件在树中。
---- 但是要注意,对于全局主题、文字等更新,必然会从顶节点进行遍历,这是无法避免的,虽然会让产生一定延迟,但这些都是视觉不敏感操作,操作次数也不是非常频繁。...() { super.initState(); print('-----Shower#initState----------'); } @override Widget build...其根本原因是在较高的层级进行了 setState ,导致其下树被遍历,在这种情况下执行动画,是不可取的。我们需要做的是降低更新元素节点层级。...正面面教材 AnimatedBuilder 需要做的改变: 1、移除监听动画器 2、使用 AnimatedBuilder @override void initState() { super.initState...对于应界面 UI 来说,我们需要关注的是如何将 Build 过程的消耗降到最低,特别是对于动画、滑动这样会持续跟新渲染的场景。
:这个 key 属性 类似于 React/Vue 中的 key,主要的作用是决定下一次 build 时复用旧的 widget,决定的条件在 canUpdate() 方法中。...实际上,context 是当前 widget 在 widget 树中位置中执行 “相关操作”的一个句柄,比如它提供了从当前 widget 开始向上遍历widget树,以及查找父类 widget 方法 class...第一次插入到树中 Widget 时调用,对于每一个 State 对象,Flutter framework 只会调用一次该回调,所以通常在该回调中做一些一次性的操作,如状态初始化,订阅子树的时间通知等...同时相等时 此方法会被调用 deactivate() 当 State 对象从树中被移除时,会调用此回调。...如果移除之后没有重新插入到树中则紧接着就会调用 dispose() 方法 dispose() 当 State 对象从树中被永久移除时调用;通常子此回调中释放资源 class CounterWidget
>[your_child], ); 如何避免FutureBuilder频繁执行future方法 错误用法: @override Widget build(BuildContext context) {...() { future = Future.value(42); super.initState(); } @override Widget build(BuildContext...), ], ) Stack 子组件设置了宽高不起作用 在Stack中设置100x100红色盒子,如下: Center( child: Container( height: 300,...如何移除debug模式下右上角“DEBUG”标识 MaterialApp( debugShowCheckedModeBanner: false ) 如何使用16进制的颜色值 下面的用法是无法显示颜色的...flutter命令时经常遇到上面的问题, 解决办法一: 1、Mac或者Linux在终端执行如下命令: killall -9 dart 2、Window执行如下命令: taskkill /F /IM dart.exe
initState() 表示当前 State 将和一个 BuildContext 产生关联,但是此时BuildContext 没有完全装载完成,如果你需要在该方法中获取 BuildContext ,可以...didChangeDependencies() 在 initState() 之后调用,当 State 对象的依赖关系发生变化时,该方法被调用,初始化时也会调用。...deactivate() 当 State 被暂时从视图树中移除时,会调用这个方法,同时页面切换时,也会调用。...dispose() Widget 销毁了,在调用这个方法之前,总会先调用 deactivate()。 didUpdateWidge 当 widget 状态发生变化时,会调用。...[flutter - 生命周期] 常见业务场景: 1.Widget A打开Widget B: 调用 Navigator.push(B) B构造函数--->B initState--->B didChangeDependencies
在 _ColorBoxState#initState 和 _ColorBoxState#dispose 回调方法中分别打印信息。...() { super.initState(); _checked = false; print('-----_ColorBoxState#initState---${widget.index...先看如何使 State 保持状态。...但可惜,这是在我的 bgm 中。我轻轻地将 addAutomaticKeepAlives 置为 false (默认false) 。...s to preserve /// their state when they would otherwise be garbage collected off-screen. /// 通常,懒加载列表中的