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

Flutter: setState inside Build

Flutter是一种跨平台的移动应用开发框架,由Google开发和维护。它使用Dart语言编写,并且具有快速开发、高性能和美观的用户界面的特点。

在Flutter中,setState是一个重要的方法,用于更新应用程序的状态并重新构建用户界面。它接受一个回调函数作为参数,该回调函数用于更新状态。当调用setState时,Flutter会重新运行build方法,以便根据新的状态重新构建用户界面。

然而,在build方法中调用setState是不推荐的,因为它可能导致无限循环的重建。这是因为每次调用setState时,build方法都会被调用,而build方法中又调用了setState,从而形成了一个循环。

为了避免这种情况,可以将setState放在其他方法中调用,例如在按钮的点击事件中或在生命周期方法中。这样可以确保setState只在需要更新状态时才被调用,避免了不必要的重建。

对于Flutter开发者来说,了解setState的正确使用方法非常重要,以确保应用程序的性能和用户体验。在开发过程中,可以使用Flutter提供的丰富的文档和示例来学习和掌握setState的使用技巧。

腾讯云提供了一系列与Flutter相关的产品和服务,例如云开发、移动推送、移动分析等。这些产品可以帮助开发者更好地构建和管理Flutter应用程序。具体的产品介绍和文档可以在腾讯云官网上找到。

参考链接:

  • Flutter官网:https://flutter.dev/
  • 腾讯云移动开发:https://cloud.tencent.com/solution/mobile-development
  • 腾讯云云开发:https://cloud.tencent.com/product/tcb
  • 腾讯云移动推送:https://cloud.tencent.com/product/tpns
  • 腾讯云移动分析:https://cloud.tencent.com/product/ma
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

flutter源码:setState分析

setState方法算是flutter使用最频繁的方法了,每次页面数据有改变,都需要调用这个方法,去触发页面的刷新,展示最新的UI效果,接下来从源码角度解读下setState后具体发生了什么 系统源码部分...didChangeDependencies = false; } super.performRebuild(); } 然后调用super的performRebuild方法,然后又回调到StatefulElement的build...方法 Widget build() => state.build(this); 最终触发的地方,就是在这里了 总结 setState其实就是告诉系统,在下一帧刷新的时候,需要更新当前widget,整个过程...,是一个异步的行为,所以下面的三个写法,效果上是一样的 // 写法一 _counter++; setState(() {}); // 写法二 setState(() {..._counter++; }); // 写法三 setState(() {}); _counter++;

55810

Flutter | 启动,渲染,setState 流程

下面我们以 setState 的更新流程为例先对整个更新流程有一个比较深的印象。 setState 执行流 void setState(VoidCallback fn) { assert(fn !...这也侧面说明如果你频繁的 setState 的时候,如果上次的渲染流程没有完成,则不会发起新的渲染。...注释2:flutter framework 想 Flutter Engine 发起一个请求,接着 Flutter 引擎会在合适的时机去调用 onBeginFrame 和 onDrawFrame。...到此,setState 中最核心的就是触发了一个 请求,在下一次屏幕刷新的时候就会回调 onBeginFrame,执行完成之后才会调用 onDrawFrame 方法。...上屏,会将绘制出的bit数据发送给GPU .....///// } } 复制代码 以上,便是 setState 调用的大概过程,实际的流程会更加复杂一点,例如在这个过程中不允许再次调用 setState

1.1K10

FluttersetState更新原理和流程

分析 Flutter状态类: StatelessWidget:无状态类,没有状态更新,界面一经创建无法更改; StatefulWidget:有状态类,当状态改变,调用setState()方法会触发StatefulWidget...也就是只有当我们的类是有状态类的时候才能进行状态刷新,setState也是在State(有状态类)类里 解析 :framework.dart文件State类 调用 setState() 必须是没有调用过...if (mounted) { setState(() {}); } setState方法 void setState(VoidCallback fn) { ......_element.markNeedsBuild(); } setState方法除了一些条件判断就是:_element.markNeedsBuild();那我们看看markNeedsBuild。...阶段触发的微任务(Microtasks) persistentCallbacks WidgetsBinding.drawFrame 和 SchedulerBinding.handleDrawFrame 过程,build

73820

Flutter 的状态管理方案:setState、BLoC、ValueNotifier、Provider

setState 加载状态可以经过以下流程,添加到刚刚的实现中: 将我们的 widget 转化为 StatefulWidget 定义一个局部 state 变量 将该 state 放进 build 方法中...这是 Flutter SDK 中 ValueNotifier 的实现: /// A [ChangeNotifier] that holds a single value. /// /// When [value...如下是他们的比较方式: setState ↔︎ 最精简的代码 BLoC ↔︎ 最多的代码 ValueNotifier ↔︎ 中等水平 所以 setState 方案最适合这个例子,因为我们需要处理单个小部件的各自的状态...Flutter & Firebase Udemy 课程中有深入介绍。...这可以通过此链接进行了解(点这个链接有折扣哦): Flutter & Firebase: Build a Complete App for iOS & Android 祝你代码敲得开心!

4.4K00

当永恒的软键盘问题遇到Flutter

那么使用 Flutter 的时候,遇到软键盘出来的时候又会遇到什么问题呢?最近在练习使用 Flutter,顺便撸个自己的 APP,遇到了这个问题,把自己的实践顺便拿出来分享一下。.../ scaffold, the body can be resized to avoid overlapping the keyboard, which /// prevents widgets inside...final ValueChanged heightChange; final ValueChanged initHeight; @override Widget build...Flutter 因为是响应式的布局开发,和 Android 这种命令式开发一个很大的区别就是基本避免直接操作一个 ui 的元素,这时候会遇到 2 个问题 如何获取宽高 build的时候元素还没渲染完毕,....size.height 虽然 build 的时候我们无法判断宽高,但是我们可以监听渲染完毕的时候。

3.3K30

Flutter Widget框架之旅 顶

(() { // This call to setState tells the Flutter framework that // something has changed...If we changed _counter without calling // setState(), then the build method would not be called...在Flutter中,这两种类型的对象具有不同的生命周期。 小部件是临时对象,用于构建当前状态下的应用程序演示文稿。 另一方面,State对象在调用build()之间是持久的,允许它们记住信息。...(() { // When user changes what is in the cart, we need to change _shoppingCart // inside...如果您在修改窗口小部件的内部状态时忘记调用setState,则框架将不知道您的窗口小部件是脏的,并且可能不会调用窗口小部件的build函数,这意味着用户界面可能不会更新以反映已更改的状态。

6.7K20

StatefulWidget与State

(26863): page1 build 当我们进入第二个界面时 I/flutter (26863): page2 initStateI/flutter (26863): page2 didChangeDependenciesI.../flutter (26863): page2 build 当我们从第二个界面返回时 I/flutter (26863): page2 deactivateI/flutter (26863): page2...dispose 最后我们在第一个界面尝试下热更新 I/flutter (26863): page1 reassembleI/flutter (26863): page1 build 下面是相关生命周期的调用次数...在开始了解setState方法之前我们还需要来了解下一个枚举类_StateLifecycle,它是flutter中的一个私有类,用来表示State的生命周期。...小结 StatefulWidget是由状态组建,我们可以使用setState方法来重新构建组建 StatefulWidget的Wdiget是通过State的Build方法构建的 setState方法将要重新构建的

1.4K10

Flutter State生命周期

2.2.1实测 写个有状态类并混入WidgetsBindingObserver配合监听特殊状态及其一个按钮,调用setState, 给生命周期的方法新增打印: import 'package:flutter...(fn) { super.setState(fn); print('状态刷新 setState'); } @override Widget build(BuildContext...点击按钮打印: I/flutter (16141): 状态刷新 setState // count也+1了,说明重新调用过build。...2.2.2流程图 图解主要部分: 1.构建(build); 2.如果用户调用了setState时则状态刷新,重新build; 3.如果销毁先停用然后dispose销毁再结束; 构造函数 构造函数不属于生命周期...build 构建 会在以下场景调用: initState()之后; didUpdateWidget()之后; setState()之后。 didChangeDependencies()之后。

80620

Flutter】Animation 动画 ( Flutter 动画基本流程 | 创建动画控制器 | 创建动画 | 设置值监听器 | 设置状态监听器 | 布局中使用动画值 | 动画运行 )

方法 : 动画如果生效, 必须在监听器中调用 setState 方法 , 以便重新调用 build 方法进行布局渲染 , 否则 UI 界面不会刷新 ; " 设置值监听器 " 代码示例 : //...方法 ..addListener(() { /// 调用 setState 方法后, 更新相关状态值后, 自动调用 build 方法重构组件界面 setState((...方法 : 动画如果生效, 必须在监听器中调用 setState 方法 , 以便重新调用 build 方法进行布局渲染 , 否则 UI 界面不会刷新 ; " 设置状态监听器 " 代码示例 : /...build 方法重构组件界面 setState(() { /// 获取动画状态 animationStatus = status; });...方法 ..addListener(() { /// 调用 setState 方法后, 更新相关状态值后, 自动调用 build 方法重构组件界面 setState((

1.3K40

原来Flutter代码是这样运行在原生系统的!快来了解Flutter标准模板,感受原生系统中Flutter的魅力!

3.1 Widget 组件视觉效果的封装,UI界面的载体,因此还要为它提供一个方法,告诉Flutter框架如何构建UI界面,即build。...setState方法是Flutter以数据驱动视图更新的函数,会通知Flutter框架:我这儿有状态改变,赶紧给我刷新界面!...而Flutter框架收到通知后,会执行Widget#build,根据新状态重建界面。 状态的更改一定要配合使用setState。...通过该方法调用,Flutter会在底层标记Widget的状态,随后触发重建。示例即使修改_counter,若不调用setStateFlutter框架也不会感知到状态变化,因此界面也不会有任何改变。...在这个函数中,通过调用setState更新_counter属性同时,也通知Flutter框架其状态发生变化。

36520

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

一个 widget 通常由一些低级别的 widget 组成,flutter 框架依次的构建这些低级别的 widget,直到构建到最底层的子 widget 时,它会计算并描述 widget 的几何形状 flutter...导入相应的依赖即可使用: import 'package:flutter/widgets.dart'; import 'package:flutter/material.dart'; import 'package...时被获取,同时,在 widget 生命周期中可以被改变,改变发生时,可以调用其 setState() 方法通知 framework 发生改变,framework 会重新调用 build 方法重构 widget...widget 绘制 - build 使用热重载时 I/flutter (28866): 热重载 - reassemble I/flutter (28866): widget 重构 - didUpdateWidget...I/flutter (28866): widget 绘制 - build 更改路由(移除当前 widget)后使用热重载时 I/flutter (28866): 热重载 - reassemble I/

1.7K50
领券