核心特性:不可变性 Widget 的不可变性是其设计的核心。这意味着一旦一个 Widget 被创建,它的属性(如文本内容、颜色、尺寸)就无法被修改。...有状态 Widget(StatefulWidget):需要动态变化的 Widget,如可点击的按钮、可输入的表单。...State 与 StatefulWidget 的关联规则: 一个 StatefulWidget 可以对应多个 State 实例(如 ListView 中重复创建的列表项 Widget)。...存储动态数据(可变),State 绑定到 StatefulWidget 上,通过 setState 触发 Widget 重建。...建议结合简单的实战案例(如实现一个带计数器的按钮、一个可切换的列表),亲手体验三者的协同过程,才能真正内化理解。
Stateless widgets 是不可变的, 这意味着它们的属性不能改变 - 所有的值都是最终的. Stateful widgets 持有的状态可能在widget生命周期中发生变化....实现一个 stateful widget 至少需要两个类: 一个 StatefulWidget类。 一个 State类。...StatefulWidget类本身是不变的,但是 State类在widget生命周期中始终存在....Flutter有一套丰富、强大的基础widget,其中以下是很常用的: Text:该 widget 可让创建一个带格式的文本。...Row、 Column: 这些具有弹性空间的布局类Widget可让您在水平(Row)和垂直(Column)方向上创建灵活的布局。其设计是基于web开发中的Flexbox布局模型。
StatefulWidget的场景已经完全覆盖了StatelessWidget,因此我们在构建界面时,往往会大量使用StatefulWidget来处理静态的视图展示需求,看起来似乎也没什么问题。...其中,对于组件完成创建后就无需变更的场景,状态的绑定是可选项。这里的“可选”就区分出了Widget的两种类型,即:StatelessWidget不带绑定状态,StatefulWidget带绑定状态。...因为,之前我们提到,Widget是不可变的,发生变化时需要销毁重建,所以谈不上状态。那么,这到底是怎么回事呢? 其实,StatefulWidget是以State类代理Widget构建的设计方式实现的。...但事实是,StatefulWidget的滥用会直接影响Flutter应用的渲染功能。 现在我们回顾一下Widget的更新机制: Widget是不可变的,更新则意味着销毁+重建(build)。...这里你可能会有疑问,如果我在一个默认不可变的场景下使用StatefulWidget,那么我肯定不会主动调用其setState方法啊,如果我不主动调用setState,那么不就不会影响StatefulWidget
不可变的东西我是非常喜欢的,就像写代码一样,一旦定义了一个不可变的变量,我就不用再关心它之后的所有事情,因为它不可变的性质,致使它不会发生不可预期的问题,只需直接使用它即可。...但一个程序只有不可变的配置是不行的,我们不可能编写一个只绘制一次后就停止的应用。...因为一旦数据改变,不可变的配置是不可能帮助我们刷新 ui,达到我们预期的效果;而有状态小部件 StatefulWidget 却可以轻松解决这些事情。...StatefulWidget 提供不可变的配置信息以及可以随着时间变化而触发的状态对象;通过监听状态的变化来达到 ui 的更新。...StatefulWidget 保留了 StatelessWidget 的特性,即保证 final 数据的不变性,而对于非 final 可变数据,将通过 Stete 进行管理。 ?
StatefulWidget | StatelessWidget 区别: StatelessWidget无状态组件:初始化后无法修改其状态和UI StatefulWidget有状态组件:在调用...StatelessWidget自身组成 StatefulWidget是包含:StatefulWidget的子类(组建类)和State的子类(状态类) ---- StatefulWidget |...StatefulElement(this); //为该组件创建可变状态,返回值是一个Diagnosticable的拓展抽象类State @protected State createState...StatefulWidget和State的生命周期并不一样。...2.在Flutter中Widget都是不可变的,所以在flutter中可变组件有Widget(UI)和State(管理状态)两个类组成。 ---- Widget生命周期 ?
修饰 /// 所有的 Widget 组件都是不可变的 final String name; final int?...class StudentStatelessWidget extends StatelessWidget{ /// 组件属性必须使用 final 修饰 /// 所有的 Widget 组件都是不可变的...> createState() 方法返回值类型 State 需要设置一个泛型 , 说明该 State 是用于哪个 StatefulWidget 组件的 ; 该泛型必须是 StatefulWidget 的子类.../// 所有的 Widget 组件都是不可变的 final String name; final int?...extends Widget { } Widget 类由 @immutable 注解修饰 , 被该注解修饰的类 , 该类以及其子类中 的 成员变量都是不可变的 , 即都要被 final 类型修饰 ;
下面的演示视频显示了如何在颤动中创建流畅的滑块。它显示了如何在flutter应用程序中使用flutter_fluid_slider软件包来工作流体滑块传送带。...它显示了具有不同颜色的三流体滑块,并为用户使用了不同的工作属性。它会显示在您的设备上。 属性 onChanged: 此属性是必需的,并且在用户开始为滑块选择新值时调用该属性。...传递的值将是滑块开始更改之前的最后一个[value]。 value: 此属性是必需的,并且用于此滑块的当前选定值。在与该值相对应的位置上绘制滑块的拇指。...当我们运行应用程序时,我们应该获得屏幕的输出,如屏幕下方的截图所示。 img 现在,我们将创建第三个“流体”滑块。...material.dart'; import 'package:flutter_fluid_slider/flutter_fluid_slider.dart'; class HomePage extends StatefulWidget
StatefulWidget 它的核心思想是: Widget 负责描述 UI State 负责保存和管理状态 五、StatefulWidget 的基本结构 class Counter extends StatefulWidget...这是 Flutter 的设计核心: Widget:不可变(immutable) State:可变(mutable) 好处: UI 描述稳定 状态变化可控 Flutter 可以高效更新界面 七、setState...十一、Widget、State、build 的关系图 StatefulWidget(不可变) ↓ State(可变) ↓ build()...十四、总结 本篇你学会了: StatelessWidget 的边界 什么是 State StatefulWidget 的结构 setState 的作用 你已经正式跨入: Flutter 状态驱动 UI...的世界 下一篇预告 《Flutter 零基础入门(十八):StatefulWidget 生命周期初识》 下一篇我们将学习: initState 是什么时候执行的?
前言: 本文将自定义一个FlutterWidget的动画组件,Flutter有颤动的意思 在此之前会讲一下AnimatedWidget与AnimatedBuilder是什么,如何使用 所以本文是一篇挺重要的文章...class FlutterText extends StatefulWidget { var str; var style; FlutterText(this.str, this.style...class FlutterText extends StatefulWidget { var str; var style; FlutterText(this.str, this.style...class FlutterText extends StatefulWidget { final Widget child; FlutterText({this.child}); _FlutterTextState...在build方法里生成刚才的带有颤动效果的组件 ?
状态是在构建widget时可以同步读取的信息,或者在widget的生命周期中可能更改的信息,在Flutter中如果要管理状态需要用到 StatefulWidget。...这个类继承了StatelessWidget-它包含不可变数据 无状态widget的build方法通常只会在以下三种情况调用: 将widget插入树中时 当widget的父级更改其配置时 当它依赖的InheritedWidget...StatefulWidget 是可变状态的widget。 使用setState方法管理StatefulWidget的状态的改变。...如果一个widget是最终的或不可变的,那么它就是无状态。...将StatefulWidget添加到widget树中 将自定义的StatefulWidget添加到应用程序构建方法中的widget树中: class MyStatelessWidget extends
,每个显示元一旦诞生就是不可变的 ?...: g(x) = 2x 由于StatelessWidget本身不可变,但并不意味着它不能借助外界来变 就像 f(x) = 2 是一条不变的横线。...每个方法都会在组件相应的状态回调,这样看来StatefulWidget更像是一个有生命的东西,而StatelessWidget更像是个死的玩偶。...---- 如果你在Widget中写了一个不是final的字段,虽然不会崩,但AS小姐姐会抱怨: "TM,说好的在一起,永远不改变immutable(不可变),你不final是几个意思。"...但有时确实需要有改变的字段怎么办?一个字:用StatefulWidget 如果想在组件移除的时候释放对象怎么办:一个字:用StatefulWidget 什么是用StatelessWidget。
从叶尼塞河至勒拿河之间1500公里的范围都曾看见,爆炸声在直径为2000公里范围可听到,世界各地的地震仪都有地震波记录下来。 流星降落的头几夜,天光明亮,在高加索不用点灯即可看报。...它们唯一的区别就是运行时 重新加载 组件的方式不同,StatelessWidget 组件重新加载时重新创建当前组件的实例,而StatefulWidget组件重新加载时不会重新创建实例,而是重新执行 build...StatefulWidget 组件创建的方式: class StatefulWidgetDemo extends StatefulWidget { @override _StatefulWidgetDemoState...StatefulWidget 组件重绘需要调用 setstate 方法,setState 会使其自身及其子组件重绘,所以尽量封装 StatefulWidget 组件,避免无效的重建和重绘,影响性能。...Material vs Cupertino Flutter 中包含两套风格的组件,分别是 Material 和 Cupertino ,Cupertino 是 iOS风格的组件,命名都带 Cupertino
在Flutter中,自定义组件其实就是一个类,这个类继承自StatelessWidget/StatefulWidget。 StatelessWidget是无状态组件,状态不可变的Widget。...StatefulWidget是有状态组件,持有的状态可能在Widget生命周期改变。也就是说,如果我们想改变页面中的数据,那么就需要用到StatefulWidget。...提供非null itemCount可提高ListView估计最大滚动范围的能力。 customScrollV 自定义ScrollView 创建ScrollView使用条子创建自定义滚动效果的。...这是基于与Future交互的最新快照构建的。 nosm 没有这样的方法 访问不存在的方法或属性时,将调用此方法。...这样我们就可以通过statefulW这个快捷指令来快速生成StatefulWidget的创建代码了。
StatelessWidget因为是无状态的,所以它只会根据初始传入的配置信息来构建Widget,因为Widget是不可变的,所以StatelessWidget创建出来就不会再变化。...StatefulWidget和StatelessWidget不同的地方在于,StatefulWidget可以和一个State进行关联。...State中可以包含一些可变的属性,这些属性可以跟用户的操作进行交互,从而完成一些比较复杂的功能。 假如我们需要下面的一个界面,界面右下方有一个按钮,点击一次,可以将中间的数字加一。...这是一个很明显的和用户交互的行为。这里我们就可以用到StatefulWidget。...StatefulWidget关联的state中的,而不是StatefulWidget本身。
它的工作就像房子的电源开关。 本文中,我们将探讨Flutter中 的**Custom Rolling Switch in Flutter。...假设此属性的价值回报为true,则此开关为ON,为OFF则为false。当此属性无效时,开关小部件会失效。 该演示视频展示了如何在颤动中创建自定义滚动开关。...它显示了在用户按下按钮后进行的切换交互,该开关将滚动到具有动画效果的另一侧,并且在滚动该开关时将更改图标和文本。...我们将添加animationDuration手段来延迟动画的开始并添加onChanged表示用户打开或关闭开关的时间。当我们运行应用程序时,我们应该获得屏幕的输出,如屏幕下方的截图所示。...material.dart'; import 'package:lite_rolling_switch/lite_rolling_switch.dart'; class DemoScreen extends StatefulWidget
我们看不明白的可能就是类继承时使用到的 StatelessWidget 和 StatefulWidget 两个类(组件)以及一些Flutter Widget。...state 是状态的意思, widget 是(小)部件的意思。 StatelessWidget : 不可变状态窗口部件,也就是你在使用时不可以改变,比如固定的文字(写上后就在那里了,死也不会变了)。...StatefulWidget : 具有可变状态的窗口部件,也就是你在使用应用的时候就可以随时变化,比如我们常见的进度条,随着进度不断变化。...像上面代码中MyHomePage类就是继承的这个组件,因为HomePage中有一个计数的(+号点击),这个是一个动态的组件,所以我们使用了StatefulWidget。...不管是StatelessWidget,StatefulWidget,还是代码中看到的Center,Column,Text等都是Flutter为我们封装好的Widget,我们可以直接使用,这些组件我们会在以后介绍
GridView 小结: 将多个widget放进一个表格中 当超出渲染范围时,自动提供滚动功能 可自定义格子,也可用下面提供的2种 GridView.count 指定列的数目 GridView.extent...ListView ListView能以列的形式展示数据。当内容超过渲染范围时,自动提供滚动的功能。...Stack 小结: 用来在当前widget上面再盖上一层widget Stack children中的第一个widget放在最下,后面的widget会一层层盖上去 Stack的内容不支持滚动 可以裁剪超出范围的子...elevation取值范围,参考 Elevation and Shadows 若设置的范围外的值,阴影效果会消失。...ListTile 小结: 可定制3行带图标的文字 相比于Row,配置更少,但更易用 加一个主界面 放置一些按钮,点击跳转到相应的界面。
Flutter会根据自带的应用模板,自动生成简单计数器示例应用Demo。我们先运行此示例,效果如下: 每点击一次右下角带“+”号的悬浮按钮,就可以看到屏幕中央的数字随之+1。...3.4 StatefulWidget V.S StatelessWidget的接口设计 因为Widget要依据数据才能完成构建,对StatefulWidget来说,其依赖的数据在Widget生命周期中可能频繁变化...属性可变的文本:‘You have pushed the button this many times:$_counter’。...应用首页则为MyHomePage,一个拥有_MyHomePageState状态的StatefulWidget。...与StatefulWidget的区别,以及如何通过State的成员函数setState以数据驱动的方式更新状态,从而更新页面。
状态逻辑复用问题 我们都知道Flutter体系里有两种Widget,无状态的StatelessWidget和有状态的StatefulWidget。Widget是不可变的。...如果需要在Element生命周期内拥有可变的状态,那就只好把这些可变的东西都塞进State里面了。可变的状态其实就是个时间的函数,S = f(t)。...如果说S是状态值,那么这个函数f()就是状态逻辑了,而时间t的取值范围是Element的生命周期。可变状态值是状态逻辑的时间函数值。...但当我们的请求需要外部传入一个用户名uerId的时候。可能就变成下面这样的了: class Example extends StatefulWidget { //多了个userId....因为一个StatefulWidget对应一个State,所以复用其实就是在做零碎的复制粘贴。这显然是繁琐且容易出bug的操作。 解决方案是怎样的 通过上面的分析。
Provider 的基本使用 Provider 是一个基于 InheritedWidget 的轻量级状态管理框架,主要用于在 Flutter 应用中高效共享和管理数据状态。...为减少不必要的重建,可通过以下方式优化: 使用 Consumer 控制刷新范围 Consumer 仅在数据变化时重建其子 Widget: Consumer( builder...Provider,局部状态优先使用 StatefulWidget。...不可变数据:推荐结合 freezed 等库实现不可变数据模型,减少意外修改。...通过合理使用 Provider 及其衍生组件(如 Consumer、Selector),可以在保持代码简洁的同时高效管理应用状态。