Flutter Widget中的State
一、Flutter 的声明式视图开发
// Android 设置某文本控件展示文案为 Hello World
TextView textView = (TextView) findViewById(R.id.txt);
textView.setText("Hello"); // iOS 设置某文本控件展示文案为 Hello World
UILabel *label = (UILabel *)[self.view viewWithTag:100];
label.text = @"Hello";
对我们来说,如果要实现同样的需求,则要稍微麻烦点:
除了设计好 Widget 布局方案之 外,还需要提前维护一套文案数据集,
并为需要变化的 Widget 绑定数据集中的数据,使 Widget 根据这个数据集完成渲染。
总结来说,命令式编程强调精确控制过程细节;而声明式编程强调通过意图输出结果整体。
对应到 Flutter 中,意图是绑定了组件状态的 State,结果则是重新渲染后的组件。
在 Widget 的生命周期内,应用到 State 中的任何更改都将强制 Widget 重新构建。
其中,对于组件完成创建后就无需变更的场景,状态的绑定是可选项。
这里“可选”就区分出了 Widget 的两种类型,
即:StatelessWidget 不带绑定状态,而 StatefulWidget 带绑 定状态。
当你所要构建的用户界面不随任何状态信息的变化而变化时,需要选择使用 StatelessWidget,反之则选用 StatefulWidget。
前者一般用于静态内容的展示,而后 者则用于存在交互反馈的内容呈现中。
二、Widget 选型的基本原则
接下来,我分别和你介绍 StatelessWidget 和 StatefulWidget,总结一些关于 Widget 选型的基本原则。
StatelessWidget
在 Flutter 中,Widget 采用由父到子、自顶向下的方式进行构建,父 Widget 控制着子 Widget 的显示样式,其样式配置由父 Widget 在构建时提供。
用这种方式构建出的 Widget,有些(比如 Text、Container、Row、Column 等)在创建 时,除了这些配置参数之外不依赖于任何其他信息,
换句话说,它们一旦创建成功就不再关 心、也不响应任何数据变化进行重绘。
在 Flutter 中,这样的 Widget 被称为 StatelessWidget(无状态组件)。
这里有一张 StatelessWidget 的示意图,如下所示:

可以看到,在构造后,build 方法随即将子组件 RichText 通过其属性列表(如文本 data、对齐方式 textAlign、文本展示方向 textDirection 等)初始化后返 回,之后 Text 内部不再响应外部数据的变化。
那么,什么场景下应该使用 StatelessWidget 呢?
一个简单的判断规则:父 Widget 是否能通过初始化参数完全控制其 UI 展示效果?
如果能,那么我们就可以使用 StatelessWidget 来设计构造函数接口了。
StatefulWidget
与 StatelessWidget 相对应的,有一些 Widget(比如 Image、Checkbox)的展示,除了父 Widget 初始化时传入的静态配置之外,
还需要处理用户的交互(比如,用户点击按 钮)或其内部数据的变化(比如,网络数据回包),并体现在 UI 上。

StatefulWidget 示意图
之前了解到,Widget 是不可变的,发生变化时需要销毁重建,所以谈不上状态。
其实,StatefulWidget 是以 State 类代理 Widget 构建的设计方式实现的。
Flutter Widget中的State的更多相关文章
- Widget 中的 State 解析
StatefulWidget 应对有交互.需要动态变化视觉效果的场景 StatelessWidget 则用于处理静态的.无状态的视图展示 那么,StatelessWidget 是否有存在的必要?Sta ...
- Flutter Widget框架概述
Flutter Widget采用现代响应式框架构建,这是从 React 中获得的灵感,中心思想是用widget构建你的UI. Widget描述了他们的视图在给定其当前配置和状态时应该看起来像什么.当w ...
- 惊天秘密!如何在 Flutter 项目中实现操作引导
不要冒然评价我,你只知道我的名字,却不知道我的故事,你只是听闻我做了什么,却不知我经历过什么. 俗话说得好,产品有三宝,弹窗浮层加引导. 上图截图自我司 App 晓黑板中的口算模块,相信每个 App ...
- Dojo Widget中的全局变量
转自http://blog.163.com/mqsy_yj/blog/static/2940499220121014115338929/ 前期设计了一个清除widget的功能,虽然可以从html文件中 ...
- Yii中的CCheckBoxColumn在widget中的用法
'columns'=>array( array( 'class'=>'CCheckBoxColumn', 'id'=>'us ...
- 关于props和state以及redux中的state
React的数据模型分为共有数据和私有数据,共有数据可以在组件间进行传递,私有数据为当前组件私有.共有数据在React中使用props对象来调用,它包含标签所有的属性名称和属性值,props对象有三个 ...
- ui-router ^1.x在ng1中使用state events
官网信息:https://ui-router.github.io/ng1/docs/latest/modules/ng1_state_events.html Legacy state events P ...
- [UE4]Child Widget中的事件调度器
在Child Widget中新建事件调度器,就会自动在使用该Child Widget的父级界面的事件列表中自动自动出现.功能十分强大.
- Flutter开发中的几个常用函数
几个Flutter开发中的常用函数 /** 返回当前时间戳 */ static int currentTimeMillis() { return new DateTime.now().millisec ...
随机推荐
- window.ShadyCSS
window.ShadyCSS Web Components # install $ yarn add @webcomponents/shadycss@1.7.1 # OR $ npm i @webc ...
- yapi & mock JSON
yapi & mock JSON json, body https://hellosean1025.github.io/yapi/documents/mock.html response bo ...
- C++算法代码——选举学生会
题目来自:https://www.luogu.com.cn/problem/P1271 题目描述 学校正在选举学生会成员,有 n(n\le 999)n(n≤999) 名候选人,每名候选人编号分别从 1 ...
- UDP编程详解
目录 报文格式 通信过程 UDP客户端流程 UDP客户端编码 UDP服务器流程 UDP服务器编码 参考文献 UDP与TCP的不同之处是:他的通信不需要建立连接的过程.中文名称用户数据报协议.时OSI参 ...
- .NET gRPC 核心功能初体验,附Demo源码
gRPC是高性能的RPC框架, 有效地用于服务通信(不管是数据中心内部还是跨数据中心). 由Google开源,目前是一个Cloud Native Computing Foundation(CNCF)孵 ...
- DRF的orm多表关系补充及serializer子序列化
目录 一.控制多表关系的字段属性 1.如何建立基表 2.断开连表关系 3.四种级联关系 二.子序列化 一.控制多表关系的字段属性 1.如何建立基表 要在基表中配置Meta,设置abstract=Tru ...
- tibco EMS 8.2.0安装
安装环境 序号 项目 值 1 OS版本 Red Hat Enterprise Linux Server release 7.1 (Maipo) 2 内核版本 3.10.0-229.el7.x86_64 ...
- Azure Front Door(一)为基于.net core 开发的Azure App Service 提供流量转发
一,引言 之前我们讲解到使用 Azure Traffic Manager.Azure LoadBalancer.Azure Application Gateway,作为项目的负载均衡器来分发流量,转发 ...
- VSCode 微信小程序扩展开发
写在前面 为什么要开发这个扩展呢,是因为微信开发者工具自身不支持页面引入组件的跳转,人工根据引入组件路径查看对应代码的方式,效率偏低.就形如这样的json文件,引入了多个组件,比如要查看 " ...
- 部署Angular应用到Github pages
https://jeneser.github.io/blog/2017/08/08/angular-deploying-app-github-pages/ Published: August 08, ...