Flutter学习Day4 Widget 观念 StatefulWidget

今天要来介绍StatefulWidget啦
从字面上看起来就是 有状态的部件(取名字真的很重要)

when??

甚麽时候会用到呢??
就是当需要记录状态的时候
此时我们就必须采用StatefulWidget

比如说
一台新阿姆斯特朗旋风喷射阿姆斯特朗炮正在装填炮弹
就会把装填炮弹的状态记录起来
让我们知道
这个炮台Widget现在不能发射 因为还没装好炮弹


当从Widget 的蓝图 实例出一个 元素後
这个元素需要有自己的状态
元素就会问Widget
你能够帮我做一个状态的物件给我吗?
createState这个方法呢 就会生产出一个状态物件
让元素去维持住这个状态

图一

https://ithelp.ithome.com.tw/upload/images/20201016/2013129893700mjdKc.png

图二

https://ithelp.ithome.com.tw/upload/images/20201016/20131298YOwToHKka5.png

官方是用计数器来当作范例

接下来
我们要将一个原本没办法无法随着时间推移更改技术的Widget改成一个有状态的Widget

Stateless

class ItemCount extends StatelessWidget {
  final String name;
  final int count;
  ItemCount({this.name, this.count});
  @override
  Widget build(BuildContext context) => Text('$name: $count');
}

Stateful

class ItemCounter extends StatefulWidget {
  final String name;
  ItemCounter({this.name});
  @override
  State<StatefulWidget> createState() => _ItemCounterState();
}

class _ItemCounterState extends State<ItemCounter> {
  int count = 0;
  @override
  Widget build(BuildContext context) => Text('${widget.name}: $count');
}

我们可以看到 StatelessWidget需要 implement build方法
而StatefulWidget 需要 implement createState方法

接下来我们需要有一个onTap的动作来记录我们计数器总共点了几下

class _ItemCounterState extends State<ItemCounter> {
  int count = 0;
  @override
  Widget build(BuildContext context) =>  GestureDetector(
        onTap: () => {
          setState(() => {count++})
        },
        child: Text('${widget.name}: $count'),
      );
}

所以当我们点击一下屏幕 count就会+1
下一祯的时候
Stateful Element 会 Call 状态物件里的 build方法
去产生一个 内容为 tom:1 的Text文本
从而取代 tom:0 的Text文本
https://ithelp.ithome.com.tw/upload/images/20201016/20131298mDCCaMaBJE.png

有趣的是
State Object 会依附在 元素树上
即使 itemCounter (name:'Tom')替换成新的类别相同的 widget(name:'Dan')
状态还是会保持在 1

首先先抽换ItemCounter
https://ithelp.ithome.com.tw/upload/images/20201017/201312987AEaey6yhW.png

再抽换Text文本
https://ithelp.ithome.com.tw/upload/images/20201017/20131298k1WqMrky1g.png

由此可知
在抽换widget时
state一直都维持住

这就有点像是方程序赛车在比赛的时候
进入维修站
快速的补给及更换部件
但还是保持在比赛的这个状态

好啦
又到了小弟弟说再见的环节
下一篇会针对myPet的小专案
实做一个StatefulWidget
ㄅㄅ

参考

Google Developers YT


<<:  # Day32 写在Go繁之後

>>:  【修正模型】4-3 事件循环(Event Loop)与任务队列(Job Queue)

应用 LINE Front-end Framework 轻松建立互动 (1)

我们的验证码小帮手现在可以完成的项目有: 对使用者进行身份验证与绑定 判断使用者的讯息,进而回覆对应...

自动化 End-End 测试 Nightwatch.js 之踩雷笔记:等待时间

在测试一个网页时,时常会有需要等待的时候,可能是等待网页载入、等待 UI 显示或等待搜寻结果等 pa...

[Day 18] 阿嬷都看得懂的 CodePen 怎麽用

阿嬷都看得懂的 CodePen 怎麽用 VSCode 已经很棒了,不过最近比较流行的是云端协作。以目...

Day06_本部的规范就是没有规范XD"如果听到这句,是要兴奋的举手我来还是原地放生,逃跑呢?XD"

今天没有前言,幽默感本人去见周公,还未回归。 └第六章、规划 6. 规划 6.1 因应风险及机会之行...

TailwindCSS 从零开始 - 起手式

使用 CDN 载入 Tailwind CSS 如果想快速使用与把玩一下 Tailwind CSS,...