引言

在前面的学习中我们接触到了flutter中各种基本组件的使用,也学习了一些常用的布局排版方式,掌握了根据不同的UI widget合理的选用不同的Layout方式进行布局,但是我们好像在前面的学习中所有的UI都是静态的,没有任何交互式的体验,换句话说我们在之前所掌握的flutter知识都是比较死板的静态UI页,缺少了那么一点灵动性,那今天这篇文章就算是一个过渡,今天我会带领大家简单认识下flutter中的动态页。

布局对比

细心的读者可能有留意到在之前我们的讲解中大部分页的根widget都是继承StatelessWidget,像我们之前讲Text、Image、各种Layout,包括上一节讲Button的时候

class TextPage extends StatelessWidget{
....
class ImagePage extends StatelessWidget {
...
class LayoutPage extends StatelessWidget {
...
class LayoutPage extends StatelessWidget {
...
复制代码

但是在讲TextField这一节的时候我们的根widget继承的却是StatefullWidget

class TextFieldPage extends StatefulWidget {
...
复制代码

思考

1.这会有什么不一样吗? 2.这跟今天的课程有什么关系呢? 3.我应该如何选择,或者我怎么确定何时选用那种根Widget呢?

关于StatelessWidget跟StatefullWidget

关于StatelessWidget跟StatefullWidget网上一搜一大推类似的博文介绍,我不想再走老套路,把官方的翻译贴出来,然后大家看完之后还是云里雾里的不知所以然,我想把今天的分享搞的轻松跟通俗一点,不会这么的官方也不会那么的晦涩,我从我个人的理解出发去分析此二者的区别。

其实上面提到的疑惑我相信大多数刚接触flutter的读者应该都会有类似的想法,我们怎么区别二者,何时如何选用二者中的某一个呢?我结合咱们之前的分享用求同存异的观点看问题吧,细心的读者可能会发现我们之前的分像Text、Image、Button、各种Layout、甚至包括GestureDetector这些章节的分享,我们绘制的UI页都是静态的,换句话说就是一旦这些UI页被成功渲染之后就不需要页不可能去改变他的状态,就是一开始是什么样就是什么样,在UI上没有任何的变化。

代码分析

场景一:我要在UI上显示一串文字,这串文字从始至终都不需要改变,也不可能会改变,这种场景下跟布局就需要选用StatelessWidget

import 'package:flutter/material.dart';class TextPage extends StatelessWidget {@overrideWidget build(BuildContext context) {return new Scaffold(appBar: new AppBar(title: new Text("Hello Flutter"),),body: new Center(child: new Text("我从UI被渲染完成之后就这个状态,不可能发生改变",style: new TextStyle(fontSize: 18.0),textAlign: TextAlign.center,),));}
}
复制代码

效果图

如上图,这串文字从一开始就是这样,也永远是这样,这种场景下你就可以选择用StatelessWidget来渲染你的根布局,当然用StatefullWidget也能完成,但是需要用StatefullWidget实现的布局用StatelessWidget是不能完成的。

场景二:UI页上有一个按钮,我每次点击按钮UI页上的Text显示内容加1

这种情况下,我们很清楚的知道当前的UI页是不固定的,换句话说,UI页上的控件可能会在某一个时刻或者某种逻辑状态下改变自身的状态,那这个时候StatelessWidget显然是不能完成这一要求的,我们来用StatefullWidget模拟上场景二的具体实现。

效果图

示例代码

import 'package:flutter/material.dart';class TextPage extends StatefulWidget {@overrideState<StatefulWidget> createState() => MyState();
}class MyState extends State<TextPage> {var _count = 0;@overrideWidget build(BuildContext context) {return new Scaffold(appBar: new AppBar(title: new Text("Hello StatefulWidget"),),body: new Stack(children: <Widget>[new Align(child: new Text("当前count值:$_count",style: new TextStyle(fontSize: 18.0),textAlign: TextAlign.center,),),new Align(alignment: new FractionalOffset(0.5, 0.0),child: new MaterialButton(color: Colors.blueAccent,textColor: Colors.white,onPressed: () {//重新渲染当前UI页的状态setState(() {_count++;});},child: new Text('点我加下方文字自动加1'),),),],));}
}
复制代码

通过上述代码我们得知在StatefullWidget中通过setState通知重新渲染当前UI页上的所有Widget来完成改变状态。

总结

通过今天的学习我们从原先死板的UI静态页过渡到了状态可改变的UI绘制,了解到了StatelessWidget和StatefullWidget的区别,并且能根据不同的UI绘制场景合理的选用不同的根Widget,比如我们所要绘制的UI页的状态包括被渲染的内容都是始终不变的,那我们会选用StatelessWidget来完成,如果所绘制的UI可能在未来的某个场景下发生变化我们会选用StatefullWidget来实现。

Flutter入门进阶之旅(九)StatelessWidget StatefullWidget相关推荐

  1. Flutter入门进阶之旅(十二)Flutter 数据存储

    前言 之前的章节我们基本上把Flutter中基础部分的东西都做了简单的讲解,通过前面章节的循序学习读者也基本能完成一些简单的UI绘制并能利用Flutter处理一些简单的用户交互,读者可能也留意到,我们 ...

  2. Flutter入门进阶之旅(二)Hello Flutter

    开题 好像几乎我们学习或者掌握任何一门编程语言都是Hello word开始的,本篇博文做为Flutter入门进阶的第一篇分享,我们也从最简单的Hello world开始,至于Flutter开发环境的配 ...

  3. Flutter入门进阶之旅(七)GestureDetector

    引言: GestureDetector在Flutter中负责处理跟用户的简单手势交互,GestureDetector控件没有图像展示,只是检测用户输入的手势,并作出相应的处理,包括点击.拖动和缩放.许 ...

  4. maters鸿蒙系统,Flutter入门进阶之旅(十)DialogToast

    做原生开发的时候,我们都知道要想让一个app做的活灵活现,与用户交互时有更棒的体验,各种样式美轮美奂的对话框跟提示是必不可少的,Flutter在设计对话框的时候充分考虑到了在UI上的体验,帮助我们设计 ...

  5. 动态规划系列问题—从小白到大佬的入门、进阶之旅!!!

    前言 本篇文章写了将近一万五千字,整理了关于动态规划系列问题的绝大部分分支,包括动态规划的介绍,相关术语等基础内容,也有区间DP,状压DP等进阶知识. 不管你是刚学习该算法的小白,还是对该算法有了一定 ...

  6. ASP编程入门进阶(九):Application

    ASP编程入门进阶(九):Application 日期:2005-1-30 15:07:59 来源:网人帝国 查看:[大 中 小] 作者:cnbruce 热度: 337   在Web应用程序中,当一个 ...

  7. 【我的OpenGL学习进阶之旅】【持续更新】关于学习OpenGL的一些资料

    目录 一.相关书籍 OpenGL 方面 C方面 NDK 线性代数 二.相关博客 2.0 一些比较官方的链接 2.1 OpenGL着色器语言相关 2.2 [[yfan]](https://segment ...

  8. 吹爆系列:教科书级别的Android音视频入门进阶学习手册,学完我成功“挤进”了抖音音视频开发岗

    Android开发工作两年,真的是感觉Android应用层开发没什么前景了,于是打算在网络安全,智能硬件,音视频这几个方向发展,考虑了一段时间,最终决定选择音视频.理由就不说了,既然选择了就要好好深耕 ...

  9. 数学建模系列:历年优秀论文+入门+进阶+国赛+美赛+其他

    数模系列:历年优秀论文+入门+进阶+国赛+美赛+其他(待更新中) 数模成绩为国二\省一\o奖\H奖,在博客做一个总结.先放国赛美赛的历年优秀论文,资料来源微信公众号数学模型.(目前完成部分:入门+进阶 ...

最新文章

  1. html的编辑器有几种,各种系统下HTML用哪种编辑器
  2. php header 重定向 url不变_PHP实现页面跳转功能
  3. atlas mysql 数据库同步_Atlas实现数据库读写分离
  4. ORACLE EXPDP命令使用详细
  5. POJ-1556 The Doors 线段相交+最短路
  6. UITextField实时监听输入文本的变化
  7. 架构之美-读书笔记之一
  8. 学好英语对IT软件工程师的影响
  9. SVN 忽略不需要提交的文件
  10. windows控制台cmd查看wifi密码
  11. 物联卡先用流量包还是套餐流量,物联卡流量扣除顺序是什么?
  12. 基于OpenCASCADE自制三维建模软件(六)瓶子模型例程
  13. 寄快递没有那么贵,大件这样寄才便宜!!!
  14. Oracle基本命令符
  15. 低功耗基础概念——ICG(Intergrated Clock Gating)
  16. 收音机磁棒天线4根接法_收音机磁性天线的使用和绕制方法
  17. python提取数据指定列_Python:提取特定列数据并将其存储到变量中
  18. 2021年最新中科院人工智能领域顶级期刊及顶级会议
  19. Android关闭内核打印log信息
  20. Frida HOOK微信实现骰子作弊

热门文章

  1. [JLOI 2011]飞行路线[USACO 09FEB]Revamping Trails
  2. django 连接mysql 数据库
  3. Cloud Native workshop
  4. Codeforces Round #343 (Div. 2) D. Babaei and Birthday Cake 线段树维护dp
  5. 可伸缩搜索框 旋转实现loading
  6. 韩军为花荣的《操盘手》写的序,不错!很有枭雄味道
  7. JVM自动化的内存分配与内存回收
  8. 基于自编码器的表征学习:如何攻克半监督和无监督学习?
  9. WPF Datagrid with some read-only rows - Stack Overflow
  10. sublime的安装