首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在initState上声明时,setState不更新变量

在Flutter中,initState是StatefulWidget生命周期中的一个方法,用于初始化状态。在initState方法中,我们可以声明并初始化变量,但是在setState方法中更新这些变量是无效的。

setState方法用于通知Flutter框架重新构建widget,并更新widget的状态。当我们调用setState方法时,Flutter会调用build方法来重新构建widget,并根据新的状态更新UI。

然而,setState方法只会更新通过setState方法中的变量来更新UI,而不会更新在initState方法中声明的变量。这是因为initState方法只会在widget第一次创建时调用一次,而setState方法会在每次状态变化时调用。

如果我们想要在initState方法中更新变量并更新UI,可以使用didChangeDependencies方法。didChangeDependencies方法会在initState方法之后立即调用,并且会在依赖的InheritedWidget发生变化时调用。在didChangeDependencies方法中,我们可以更新变量并调用setState方法来更新UI。

总结起来,当我们在initState方法中声明变量时,如果想要更新这些变量并更新UI,应该使用didChangeDependencies方法。在setState方法中更新变量是无效的。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云Flutter SDK:https://cloud.tencent.com/document/product/647/32689
  • 腾讯云移动开发服务:https://cloud.tencent.com/product/mss
  • 腾讯云云服务器CVM:https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库MySQL版:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云云原生容器服务TKE:https://cloud.tencent.com/product/tke
  • 腾讯云人工智能AI:https://cloud.tencent.com/product/ai
  • 腾讯云物联网IoT Hub:https://cloud.tencent.com/product/iothub
  • 腾讯云对象存储COS:https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务:https://cloud.tencent.com/product/bcs
  • 腾讯云游戏多媒体处理服务:https://cloud.tencent.com/product/gmp
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 【 源码之间 - Flutter 】 FutureBuilder源码分析

    FutureBuilder的使用 先定义异步任务和当前页码,使用FutureBuilder进行构造组件。全代码见文尾。...FutureBuilderState#initState中对_snapshot进行初始化 @override void initState() { super.initState(); _snapshot...这样_snapshot更新后,会重新执行build方法,又会回调外界的_builderList void _subscribe() { if (widget.future !...父组件刷新时的_FutureBuilderState的行为 点击加号时,更新异步方法,获取下一页数据,然后父组件执行setState void _doAdd() { setState(() {...说白了就是封装一下异步任务执行情况,本质也是靠setState进行更新子组件。 ---- 尾声 欢迎Star和关注FlutterUnit 的发展,让我们一起携手,成为Unit一员。

    1.9K10

    【 源码之间 - Flutter 】 FutureBuilder 使用

    FutureBuilder的使用 先定义异步任务和当前页码,使用FutureBuilder进行构造组件。全代码见文尾。...FutureBuilderState#initState中对_snapshot进行初始化 @override void initState() { super.initState(); _snapshot...这样_snapshot更新后,会重新执行build方法,又会回调外界的_builderList void _subscribe() { if (widget.future !...父组件刷新时的_FutureBuilderState的行为 点击加号时,更新异步方法,获取下一页数据,然后父组件执行setState void _doAdd() { setState(() {...说白了就是封装一下异步任务执行情况,本质也是靠setState进行更新子组件。 ---- 尾声 欢迎Star和关注FlutterUnit 的发展,让我们一起携手,成为Unit一员。

    1.1K20

    Flutter 中创建可拖动的浮动操作按钮

    必须根据移动增量更新按钮的偏移量。 一个浮动的动作按钮通常可以点击时执行一个动作,所以我们添加一个名为onPressed( VoidCallback) 的参数作为参数。...通常,所需的行为是onPressed仅在点击按钮时调用回调,而不是拖动结束时调用。然而,当拖动结束时,指针向上事件也会被触发。作为解决方案,我们需要跟踪按钮是否被拖动。...该_isDragging状态变量是为此目的而设立。它应该更新到true指针移动时。...所以,我们可以检查内部onPointerUpcallback 仅onPressed值为_isDraggingis 时调用回调false。 下面是用于创建可拖动浮动操作按钮的类。...还有一种方法_updatePosition可以根据移动增量更新当前偏移量。

    5.6K10

    Flutter局部刷新三剑客

    ValueNotifier 使用ChangeNotifier的时候,每次修改变量时,都需要手动调用notifyListeners()方法,所以,Flutter创建了一个新的组件——ValueNotifier...同时,ValueNotifier封装了一个泛型变量,简化了ChangeNotifier的创建过程,所以大部分时间我们都是直接使用ValueNotifier。...那么有了它之后,我们就可以省去新建类的步骤,对于单一的基础类型变量,直接创建ValueNotifier即可,就像上面的例子,我们可以直接改造成下面这样。...这样不仅简化了代码模板,而且不再使用setState来进行页面刷新。 ValueListenableBuilder作为一个非常经典的Widget,它的注释中,就有很多教程和示例。...value.age++; notifyListeners(); } } // 调用处 _countNotify.increment(); 通过这种方式,我们可以实现当模型内部变量更新

    17710

    【Flutter】Flutter 页面生命周期 ( 初始化期 | createState | initState | 更新期 | build | 销毁期 | dispose)

    更新期的生命周期函数 /// 方法调用时机 : /// ① 调用完 didChangeDependencies 方法后调用该方法 /// ② 调用 setState 方法之后 , 该方法也会被调用...函数 : 所处时期 : 更新期的生命周期函数 ; 调用时机 : 该生命周期方法不经常调用 , 只有父容器组件重绘时才调用该方法 ; 方法机制 : 传入的 oldWidget 参数是旧的组件信息 ,...更新期的生命周期函数 /// 方法调用时机 : 该生命周期方法不经常调用 , 只有父容器组件重绘时才调用该方法 /// 方法机制 : 传入的 oldWidget 参数是旧的组件信息 , /...更新期的生命周期函数 /// 方法调用时机 : /// ① 调用完 didChangeDependencies 方法后调用该方法 /// ② 调用 setState 方法之后 , 该方法也会被调用...更新期的生命周期函数 /// 方法调用时机 : 该生命周期方法不经常调用 , 只有父容器组件重绘时才调用该方法 /// 方法机制 : 传入的 oldWidget 参数是旧的组件信息 , /

    3.3K00

    StatefulWidget与State

    如“page1 initState” ?...): page2 build 当我们从第二个界面返回时 I/flutter (26863): page2 deactivateI/flutter (26863): page2 dispose 最后我们第一个界面尝试下热更新...组件创建或UI重新渲染 didUpdateWidget >=1 组件创建或UI重新渲染 deactivate >=1 State对象将要移除时 dispose 1 state对象被销毁 通常情况下,我们可以initState...setState如何触发界面变更 在前面很多例子中我们多次使用到setState方法,来更新Element中的数据,每次当每次数据变更时我们触发setState方法,紧接着界面就跟着变化了,大家应该都知道这是...开始了解setState方法之前我们还需要来了解下一个枚举类_StateLifecycle,它是flutter中的一个私有类,用来表示State的生命周期。

    1.4K10

    「快速上手Flutter开发系列教程」之线程和异步UI

    以上代码片段的完整部分可以课程源码中查找。 一旦 await 的网络请求完成,通过调用 setState() 来更新 UI,这会触发 widget 子树的重建,并更新相关数据。...这意味着你不能访问主线程中的变量,或者使用 setState() 来更新 UI。正如它们的名字一样,Isolate 不能共享内存。...一旦获得结果后,你可以通过调用setState来告诉Flutter更新其状态,setState将使用网络调用的结果更新UI。... iOS 中,在后台运行耗时任务时我们通常会使用 UIProgressView。 Android 中,在后台运行耗时任务时我们通常会使用 ProgressBar。...那么,Flutter也有与之对应的widget叫ProgressIndicator。通过一个布尔 flag 来控制是否展示进度。在任务开始时,告诉 Flutter 更新状态,并在结束后隐藏。

    2.2K20

    Flutter跨平台移动端开发丨Widget、Element、State、状态管理

    两者的区别在于状态的改变,需要根据当前widget是否需要管理一些状态来选择使用 StatelessWidget:无状态,比如标题栏中的标题 StatefulWidget:有状态,创建时需要指定一个 State ,需要更新...UI时调用 setState(VoidCallbackfn),并在 VoidCallback 中改变一些些变量数值等,组件会重新 build 以达到数显状态/UI的效果。...build 时被获取,同时, widget 生命周期中可以被改变,改变发生时,可以调用其 setState() 方法通知 framework 发生改变,framework 会重新调用 build 方法重构...widget 树,最终完成更新 UI 的目的。...: $number次") ], ); } @override void initState() { super.initState(); print("

    1.7K50

    提到生命周期,我们是在说什么?

    StatelessWidget是不可变的,一旦创建则无需更新;对于StatefulWidget来说,State类中调用setState方法更新数据,会触发视图的销毁和重建,也将间接触发每个子Widget...如果我们的根布局是一个StatefulWidget,那么在其State中每调用一次setState更新UI,都将是一整个页面所有Widget的销毁和重建。...,所以我们可以在这里做一些初始化工作,比如为状态变量设定默认值。...更新 Widget的状态更新,主要由三个方法触发:setState、didChangeDependencies和didUpdateWidget。...在下面的代码中,我们 initState 时注册了监听器, didChangeAppLifecycleState 中打印了当前的App状态,最后 dispose 时把监听器移除: class _

    1.7K10

    setup vs 5 react hooks,助你避开沟中陷阱

    是也会被警告,因为内部使用了num, bigNum变量,所以要求我们声明依赖。...setup内部,setup函数内部的逻辑只会被执行一次,需要用到的由渲染上下文ctx提供的api有initState、computed、 effect、 setState,同时配合setState调用时还需要读取的状态...function setup(ctx) {// 渲染上下文 const { initState, computed, effect, state, setState } = ctx; // setup...用于修改状态,我们setup内部基于setState定义完方法后,然后返回即可,接着我们可以在任意使用此setup的组件里,通过ctx.settings拿到这些方法句柄便可调用 function setup..., setState } = ctx; // 初始化数据 initState({ num: 6, bigNum: 120 }); // 定义计算函数 computed({ //

    3.1K101

    认识组合api,换个姿势撸更清爽的react

    是会被警告的,因为内部使用了num, bigNum变量写依赖会陷入闭包旧值陷阱),所以要求我们声明依赖 可是如果为了避免IDE警告,我们改为如下方式显然不是我们表达的本意,我们只是想组件卸载时报告一下数字...setup内部,setup函数内部的逻辑只会被执行一次,需要用到的由渲染上下文ctx提供的api有initState、computed、 effect、 setState,同时配合setState调用时还需要读取的状态...function setup(ctx) {// 渲染上下文 const { initState, computed, effect, state, setState } = ctx; // setup...用于修改状态,我们setup内部基于setState定义完方法后,然后返回即可,接着我们可以在任意使用此setup的组件里,通过ctx.settings拿到这些方法句柄便可调用 function setup..., setState } = ctx; // 初始化数据 initState({ num: 6, bigNum: 120 }); // 定义计算函数 computed({ //

    1.4K4847

    Stateful 组件的生命周期​

    生命周期二:initState initState 函数组件被插入树中时被 Framework 调用( createState 之后),此函数只会被调用一次,子类通常会重写此方法,在其中进行初始化操作... initState 中订阅通知。 didUpdateWidget 中,如果需要替换旧组件,则在旧对象中取消订阅,并在新对象中订阅通知。 并在 dispose 中取消订阅。...){ setState(() { ... }); } 强烈建议:调用 setState 时加上 mounted 判断。...因为如果当前组件未插入到树中或者已经从树中移除时,调用 setState 会抛出异常,加上 mounted 判断,则表示当前组件树中。...setState setState 方法是开发者经常调用的方法,此方法调用后,组件的状态变为 dirty,当有数据要更新时,调用此方法。

    98210
    领券