UI,现在我们就了解了无状态和有状态两种组件,在 Flutter 中,有两种类型的小部件:StatelessWidget 和 StatefulWidget。...使用 StatefulWidget:当小部件的外观和内容需要根据用户交互、数据变化或其他条件动态更新时,需要使用 StatefulWidget,例如表单、列表视图等。 ...,通过setState就会刷新UI,此时isUppercase 为true,则Text中显示大写,再点击一下为false就变成小写。...中进行GetX的使用了,注意在使用的时候需要导包,在哪里用就在哪里导包,然后编辑器也会提示你导包的。...最后使用Obx包裹需要局部刷新的组件,例如:Obx(() => Text(test.value)),当可观察变量值更新时,Obx包裹中的内容就会进行刷新。
改变状态后,需要通过setState来重新构建widget,就是会重新调用build方法,来得到状态同步。...最常见的Widget 接着先看看一些常用的组件,这些是随时可用的小部件,开箱即用,你会非常满意: Text - 用于简单地在屏幕上显示文本的小部件。 Image - 用于显示图像。...Container - 在Flutter中,相当于div。允许在其中进行添加填充,对齐,背景,力大小以及其他东西的加载。空的时候也会占用0px的空间,这很方便。...如果这个属性不是true的话,调用setState会报错。 注意:你可以在调用setState前,检查一下这个变量。...文档还建议,当InheritedWidget更新时,如果需要进行网络调用(或任何其他昂贵的操作),它可能会很有用。 5.build() 这个方法会经常被调用。
因为一旦数据改变,不可变的配置是不可能帮助我们刷新 ui,达到我们预期的效果;而有状态小部件 StatefulWidget 却可以轻松解决这些事情。...当我们点击其中一个未读通知信息时,我们需要将其 ui 状态变成已读的样式。根据状态来改变 ui,StatefulWidget 能够很好的实现这种场景。...方法中的布局,找到上述情况关联的 ui,在 ListView 的 item 中。...但就这样改变你会发现 ui 是不会刷新的,因为在 StatefulWidget,如果你想改变某个值,同时要同步更新 ui,需要使用 setState 方法。...由于是同一种类型 Container,将会直接被替换,同时使用更新后的 item.unread,所以对应的 Container 的 color 也将发生改变。最终呈现的是布局的刷新。
我们还是用一个小例子来看下今天的例子 定义两个界面,第一个界面有一个StatefulWidget我们点击列表后触发setState方法进入第二个界面,第二个界面同样是一个StatefulWidget,为了直观的观察有状态组建的生命周期...deactivate >=1 State对象将要移除时 dispose 1 state对象被销毁 通常情况下,我们可以在initState方法中做一些初始化工作,然后在dispose方法中做一些销毁工作...setState如何触发界面变更 在前面很多例子中我们多次使用到setState方法,来更新Element中的数据,每次当每次数据变更时我们触发setState方法,紧接着界面就跟着变化了,大家应该都知道这是...setState触发了界面的刷新,但是setState到底有什么魔法可以触发界面重构与刷新呢?...在开始了解setState方法之前我们还需要来了解下一个枚举类_StateLifecycle,它是flutter中的一个私有类,用来表示State的生命周期。
####3.2 当数据流变化时,可以刷新小部件。 Stream是一种订阅者模式,当数据发生变化时,通知订阅者发生改变,重新构建小部件,刷新UI。 ###4.如何使用streamBuild?...1.这个item是StatefulWidget,点击“关注”,然后setstate(){} 2.使用其他的状态管理去实现。...,并刷新小部件。...问题1 为何选择使用streamBuild 1.方法一使用StatefulWidget,刷新时使用setstate(){},使用setstate(){}刷新,会将整个item 进行重新构建,整个item...仅仅只有“关注”需要改变,其它控件都刷新,会造成资源浪费。
管理状态 小部件管理自己的状态 父母管理小部件的状态 混搭方法 其他交互式小部件 标准小部件 材料组件 资源 准备好 如果您已经在Flutter布局中构建布局,请跳到下一节。...小部件的状态存储在状态对象中,从而将小部件的状态与外观分开。 当小部件的状态改变时,状态对象调用setState(),告诉框架重绘小部件。 无状态小部件没有内部状态来管理。...当小部件的状态改变时,状态对象调用setState(),告诉框架重绘小部件。 在本节中,您将创建一个自定义有状态小部件。...实现_handleTapboxChanged(),当方块被点击时调用该方法。 当状态改变时,调用setState()来更新UI。...实现_handleTapboxChanged(),当方块被点击时调用该方法。 调用setState()以在发生轻击和_active状态改变时更新UI。
出于这个原因,外观和属性在小部件的整个生命周期中保持不变。 当我们描述的 UI 部分不依赖于任何其他小部件时,无状态小部件会很有用。无状态小部件的示例是文本、图标、图标按钮和凸起按钮。...例如,当我们创建一个AppBar](,无状态小部件可以是不需要更改的脚手架或图标。 无状态小部件类仅在初始化时调用一次。即使有外力作用在它上面,它也不会更新。...每当StatelessScreen小部件初始化时,build就会调用该方法。之后,小部件将打印在屏幕上。 但是如果我们希望它在有动作时更新,我们必须制作一个有状态的小部件。...一旦我们调用这个小部件并按下按钮,我们就会让文本字段的值自动改变。 在这种类型的应用程序中,我们可以通过实现. 是一种在有状态小部件类中调用的方法。每次调用时,此方法都会更改有状态小部件的值。...它将被渲染一次并且不会自行更新setState() 有一个内部并且可以在输入数据更改时重新渲染setState() 静态小部件 动态小部件 除非发生外部事件,否则无法在运行时更新 可以在运行时根据用户操作或数据更改进行更新
淡入淡出部件 作为UI开发人员,我们经常需要在屏幕上显示和隐藏元素。 但是,在屏幕上或屏幕外快速弹出元素会让最终用户感到不安。 相反,我们可以使用不透明动画淡入淡出元素,以创建流畅的体验。...在Flutter中,我们可以使用AnimatedOpacity部件来完成这项任务。...当我们更新数据时,我们也可以使用Flutter用这些更改重建我们的UI。 在我们的例子中,我们将有一块数据:一个布尔值,表示按钮是可见还是不可见。...当用户按下按钮时,我们会将布尔值从true更改为false,或将false更改为true。 我们需要使用setState进行更改,这是State类中的一个方法。...duration: 动画完成需要多长时间 child: 动画作用的部件。 在我们的案例中,绿色框。
到这里我们大概能猜知道Getx的刷新实际是利用StatefulWidget setState的实现。接下来我们接着探索Getx是如何将count状态与ObxWidget关联起来的。...当subject发生变化时会通知_observer,_observer的subject则发送事件刷新树。这里还有个问题我们什么时候调用了value的get方法呢?...答案就是我们调用RxInterface的notifyChildren时候,final result = builder();当我们调用builder会value get方法,从而关联刷新。...ObxWidget创建Observer观察者,Observer收到事件回调时调用setState刷新树,接着在build方法的时候将需要监听的Rx对象的subject添加到Observer的监听,Rx对象在...Observer在接收到subject的通知之后会调用自身的subject通知ObxWdiget实现刷新视图。
当我们在widgets目录中,我们可以看到很多小部件,如Padding,Align,SizedBox,等。我们通过组合它们来创建其他小部件,我发现这种方法可扩展、强大且易于理解。...我理解为什么教程不经常这样做:它需要更多行(在我的示例中为 100 行),人们可能想知道为什么我们要创建这么多其他小部件。由于教程旨在专注于一个概念,因此这样编写它们可能会适得其反。...当我们阅读其他地方引用的此类小部件时,我们几乎知道它的作用,而无需查看其实现。2.在阅读带有语义命名的小部件的构建方法之前,我们已经对其内容有一个大致的了解。...例如,假设我们必须在单击它时增加红星旁边的数字。在这个版本中,我们可以制作_Likes一个StatefulWidget并处理这里的增量。当用户点击星星时,只有_Likes小部件会被重建。...在第一个版本中,MyApp如果我们将其设为StatefulWidget. Flutter 文档中也解释了这种最佳实践: “当setState()在状态上调用时,所有后代小部件都将重建。
但是当我们点击 4 中的 setState 时,却发现 3 中 Text 没有发现改变, 这是为什么呢? ?...问题就在于前面 StatefulElement 的构建方法和 update 方法: State 只在 StatefulElement 的构建方法中创建,当我们调用 setState 触发 update...比如当我们在 StatefulWidget 中调用 Theme.of(context).primaryColor 时,传入的 context 就代表着这个 Widget 的 Element, 在...InheritedWidget 被更新时,通过如 Theme.of(context).primaryColor 引用的地方,也会触发更新的原因。...listener 内会调用 StateDelegate 的 StateSetter 方法,从而调用到 StatefulWidget 的 setState。
请注意,我们再次将小部件作为参数传递给其他小部件。Scaffold小部件将许多不同的小部件作为命名参数,每个小部件放置在适当位置的Scaffold布局中。...为了通知框架它改变了它的内部状态,它将这些调用包装在setState调用中。调用setState会将这个小部件标记为肮脏,并计划在下一次您的应用程序需要更新屏幕时重新构建它。...如果您在修改窗口小部件的内部状态时忘记调用setState,则框架将不知道您的窗口小部件是脏的,并且可能不会调用窗口小部件的build函数,这意味着用户界面可能不会更新以反映已更改的状态。...响应小部件生命周期事件 主要文章:State 在StatefulWidget上调用createState之后,框架将新的状态对象插入树中,然后在状态对象上调用initState。...通常,通过调用super.dispose执行dispose。 按键 主要文章:Key 您可以使用键来控制框架在小部件重建时哪个小部件匹配哪个其他小部件。
### 03.状态管理使用场景 - setState状态管理 - 适合Widget管理自己的状态,这种很常见,调用setState刷新自己widget改变状态。...- 在以下示例中,TapboxB通过回调将其状态导出到其父组件,状态由父组件管理,因此它的父组件为`StatefulWidget`。...- 实现`_handleTapboxChanged()`,当盒子被点击时调用的方法。 - 当状态改变时,调用`setState()`更新UI。...- 在这种情况下,组件自身管理一些内部状态,而父组件管理一些其他外部状态。 - 在下面TapboxC示例中 - 手指按下时,盒子的周围会出现一个深绿色的边框,抬起时,边框消失。...当用户点下时,它添加高亮(深绿色边框);当用户释放时,会移除高亮。 - 当按下、抬起、或者取消点击时更新`_highlight`状态,调用`setState()`更新UI。
当小部件的状态发生变化时,状态对象调用setState(),告诉框架重新绘制小部件。 创建状态组件 需要注意的是: /** 1....混合状态管理 对于其他的一些组件件,混合使用混合状态管理最有意义。在这个场景中,状态组件管理自己的一些状态,而父组件管理状态的其他方面。...实现了_handleTapboxChanged()方法,即在轻敲框时调用的方法。 调用setState()以在轻敲发生且_active状态更改时更新UI。...在onTapDown和onTapUp调用setState()方法更新UI,并且_higlight状态发生变化。 在_handleTap时,将状态传递到付组件中,通知父组件进行更新。...和web开发使用的场景差不多~ 我们在进行组件的封装时,本质上是在开发一个自定义的状态组件~
当用户下拉页面时,这个函数被调用,它的任务是拉取新的数据并更新我们应用中状态。很重要的一点是,这个函数返回 Future 来保持刷新指示器可见,直到新数据被下载且页面被更新。...无论选择哪种方法,目标都是确保在触发刷新操作时,应用程序的状态能够反映新数据,而不会导致用户界面的中断或者不一致。...当在 Flutter 中实现下拉刷新,使用 Provider,我们需要通过一个 provider 来暴露一个方法来刷新数据,然后在 onRefresh 回调函数中调用该方法。...在 RefreshIndicator 挂件中的 onRefresh 回调会执行这个方法,确保状态更新,并且 UI 上映射了新数据。...先进技术和最佳实践 当我们完善 Flutter 应用程序时,采用先进的技术并遵循最佳实践可以显著提高代码的质量和可维护性,特别是在实现拉动刷新等功能时。
由于无状态组件在执行过程中只有一个 build 阶段,在执行期间只会执行一个 build 函数,没有其他生命周期函数,因此在执行速度和效率方面比有状态组件更好。...中创建 State 的方法,当 StatefulWidget 被调用时会立即执行 createState 。...deactivate 在组件被移除节点后会被调用,如果该组件被移除节点,然后未被插入到其他节点时,则会继续调用 dispose 永久移除。 dispose 永久移除组件,并释放组件资源。...在StatelessWidget中,只要我们调用setState,就会执行重绘,也就是说重新执行build函数,这样就可以改变ui。...如果我们修改WidgetC,在build函数中添加一行MyInheriteWidget.of(context);那么虽然没有任何使用,依然能会跟着刷新,因为建立了依赖关系就会被通知。
一个浮动的动作按钮通常可以在点击时执行一个动作,所以我们添加一个名为onPressed( VoidCallback) 的参数作为参数。...通常,所需的行为是onPressed仅在点击按钮时调用回调,而不是在拖动结束时调用。然而,当拖动结束时,指针向上事件也会被触发。作为解决方案,我们需要跟踪按钮是否被拖动。...它应该更新到true指针移动时。所以,我们可以检查内部onPointerUpcallback 仅onPressed在值为_isDraggingis 时调用回调false。...您需要向父小部件添加一个键并将其传递给DraggableFloatingActionButton小部件从key中,你可以从currentContext属性中获取RenderBox,它有findRenderObject...因此,您需要为子小部件做类似的事情。对于子部件,可以将其包装为 Container 的子部件并将 GlobalKey 传递给 Container。 _updatePosition 方法也需要调整。
翻译过来: 控制一个小部件如何替换树中的另一个小部件。...当找到新的widget(其键和类型与相同位置的先前widget不匹配),但是在前一帧的树中其他位置有一个具有相同全局键的widget时,该widget的element将移至新位置。...当需要在一个StatefulWidget集合中进行添加、删除、重排序等操作时,才是key登场的时候。...无状态组件 下面这段代码在一个Row中展示了两个彩色方片(StatelessContainer),当点击按钮时,会交换两个方片的位置: 代码如下 import 'dart:math'; import...(() {}); } } 有状态组件 有状态组件的状态信息(如颜色)通常是存储在state中的,而state是存储在element树中的。
方案1-1 :StatefulWidget 这个相信大家都很了解了,StatefulWidget通过State来保存状态,当调用setState函数之后,整个StatefulWidget会重新执行build...的确可以,但是有个问题,如果页面里面有100个Widget,数据发生改变后,只有一个Widget需要接受这个改变,修改自己的UI,但是在这个StatefulWidget中,由于调用了setState函数...,所以这个页面中的100个Widget都将执行重建,这显然是「家里有矿系列」,所以为了避免这个问题,就需要缩小StatefulWidget的范围,让setState函数控制的刷新,尽可能的范围小,这样当...100个Widget中只有一个需要重建时,就不需要重新创建那99个不需要的Widget了。...Widget触发了ValueNotifier的更新的时候(RaisedButton触发),NotifierWidget会自动接受到通知,从而刷新UI。