Flutter 初始WidgetState 简单应用案例分析

本系列文章主要整理Flutter的知识汇总,由浅入深,从Widget的搭建到其中的原理。本文还是围绕Widget在开发中应用和理解。

关于Flutter环境配置和首次创建可以参考前面文章。链接如下:

Flutter 安装部署与认识Dart语言

Flutter 使用AndroidStudio并集成Flutter界面

书接上一篇:Flutter Widget:StatefulWidget & StatelessWidget-CSDN博客


创建Flutter应用模板项目

通过 Android Studio 或 VS Code 创建一个新的 Flutter 工程,命名为 "first_flutter_app"。创建好后,就会得到一个默认的计数器应用示例。运行创建的工程,如下图所示:

 在 lib/main.dart 文件中源码如下:

import 'package:flutter/material.dart';//导入了 Material UI 组件库
void main() => runApp(MyApp());//入口
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',//应用标题
      theme: ThemeData(primarySwatch: Colors.blue,),//主题色
      home: MyHomePage(title: 'Flutter Demo Home Page'),//应用首页路由 
    );}
}
class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;
  @override
  _MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  void _incrementCounter() {
    setState(() { _counter++;});
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar( title: Text(widget.title),),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('You have pushed the button this many times:'),
            Text('$_counter',style: Theme.of(context).textTheme.headline4,
            ),],),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,tooltip: 'Increment',child: Icon(Icons.add),
      ), );
    }
}

MyApp

它表示一个Flutter 应用,继承自 StatelessWidget类,意味着应用本身也是一个widget

应用在构建页面时,会调用Widget的build方法。该方法来描述如何构建 UI 界面。

在Flutter 中是通常是通过 Widget 嵌套 Widget 的方式来构建UI和进行事件处理的。所以,Flutter 中万物皆为Widget


自定义MyHomePage

它是这个应用的首页,继承自StatefulWidget类,表示它是一个状态可变的widget。

StatefulWidget 可以拥有状态,这些状态在 widget 生命周期中是可以变的,而 StatelessWidget 是不可变的。

两者关键区别是有没有一个 State类。 StatefulWidget类本身是不变的,但是State类中持有的状态,在 widget 生命周期中可以发生变化。


自定义_MyHomePageState

它是MyHomePage类对应的状态类,继承自State类。

看到这里,可能已经发现:MyHomePage类并没有build方法。而MyApp 和_MyHomePageState都有build方法。后面会详细解答为什么MyHomePage类并没有build方法?

构建UI界面的build方法 

前面也说过:应用在构建页面时,会调用Widget的build方法。该方法来描述如何构建 UI 界面。

MyHomePage第一次创建时,_MyHomePageState类也会被创建。当初始化完成后,Flutter框架会调用 widget 的build方法来构建 widget 树,最终将 widget 树渲染到设备屏幕上。

Scaffold 

它是 Material 库中提供的页面脚手架。它提供了导航栏、标题和body属性。路由默认都是通过Scaffold创建的。

body组件树

此例中,Center 可以将其子组件树对齐到屏幕中心。其子组件Column 组件作用是将其所有子组件沿屏幕垂直方向依次排列; 

在_MyHomePageState类中有一个点击按钮事件:floatingActionButton的onPressed。

void _incrementCounter() {
  setState(() {
     _counter++;
  });
}
setState方法

它的作用是通知 Flutter 框架状态发生了改变,Flutter 框架收到通知后,会执行 build 方法来根据新的状态重新构建widget树,更新UI界面。


为什么MyHomePage类并没有build方法?

这个问题理解为:为什么build方法放在 State中,而不是放在StatefulWidget中?

首先,StatefulWidget是一个状态可变的widget,每次状态改变都会调用build方法,而且状态是保存在 State 中的。

如果build方法不放在state中,那么build方法和状态会被分别在两个类中。每次构建时读取状态将会很不方便。大概代码会变成下面这样:

  Widget build(BuildContext context, State state){
      ...
  }

这样就会将State的所有状态声明为公开。但是,状态设置为公开后将不再具有私密性,这就会导致对状态的修改将会变的不可控。

build()方法放在State中的话,构建过程不仅可以直接访问状态,而且也无需公开私有状态。 更加方便和稳定。


至此,会不会发现仍然会有些困惑。其实,要深刻理解widget的关键在于State类。下篇见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/470157.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

湖北省地质灾害分布数据 崩塌滑坡泥石流空间分布地质灾害详查等数据集

地质灾害是指在自然或者人为因素的作用下形成的&#xff0c;对人类生命财产造成的损失、对环境造成破坏的地质作用或地质现象。地质灾害在时间和空间上的分布变化规律&#xff0c;既受制于自然环境&#xff0c;又与人类活动有关&#xff0c;往往是人类与自然界相互作用的结果。…

代码随想录算法训练营第day36|435. 无重叠区间 、 763.划分字母区间 、 56. 合并区间

目录 435. 无重叠区间 763.划分字母区间 56. 合并区间 435. 无重叠区间 力扣题目链接(opens new window) 给定一个区间的集合&#xff0c;找到需要移除区间的最小数量&#xff0c;使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] …

vue3实现输入框短信验证码功能---全网始祖

组件功能分析 1.按键删除&#xff0c;清空当前input&#xff0c;并跳转prevInput & 获取焦点,按键delete&#xff0c;清空当前input&#xff0c;并跳转nextInput & 获取焦点。按键Home/End键&#xff0c;焦点跳转first/最后一个input输入框。ArrowLeft/ArrowRight键点击…

【日常记录】【插件】使用 html2canvas增加水印

文章目录 1、需求2、html2canvas3、实现4、参考链接 1、需求 实际开发中&#xff0c;经常需要将网页元素转换为图片&#xff0c;以便进行保存、分享或打印等用途。,一般想到的方案就是canvas 比如这个,需要把这个DOM转化成一个图片 2、html2canvas html2canvas 可以把DOM结构转…

vivado 物理优化约束、交互式物理优化

物理优化约束 Vivado Design Suite在物理优化过程中尊重DONT_TOUCH特性。它不在具有这些属性的网络或小区上执行物理优化。要加快网络选择过程中&#xff0c;具有DONT_TOUCH属性的网络经过预过滤&#xff0c;不被考虑用于物理优化。此外&#xff0c;还遵守Pblock分配&#xff…

ClickHouse--13--springboot+mybatis配置clickhouse

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 ClickHouse1.添加maven依赖2.配属数据源3.参数配置4.Druid连接池配置5.entity6.Mapper接口7.Mapper.xml8.controller接口9.创建一个clickhouse表10.测试 ClickHouse…

MySQL数据库概念及MySQL的安装

文章目录 MySQL数据库一、数据库基本概念1、数据2、数据表3、数据库4、数据库管理系统&#xff08;DBMS&#xff09;4.1 数据库的建立和维护功能4.2 数据库的定义功能4.3 数据库的操纵功能4.4 数据库的运行管理功能4.5 数据库的通信功能&#xff08;数据库与外界对接&#xff0…

网络简略总结

目录 一、三次握手 四次挥手 1、三次握手:为了建立长链接进行交互即建立一个会话,使用http/https协议 2、四次挥手是一个断开连接释放服务器资源的过程 3、如果已经建立了连接,但是客户端突然出现故障了怎么办? 4、谁可以中断连接?客户端还是服务端还是都可以? 5、…

小朋友排队(蓝桥杯,acwing,归并)

题目描述&#xff1a; n 个小朋友站成一排。 现在要把他们按身高从低到高的顺序排列&#xff0c;但是每次只能交换位置相邻的两个小朋友。 每个小朋友都有一个不高兴的程度。 开始的时候&#xff0c;所有小朋友的不高兴程度都是 0。 如果某个小朋友第一次被要求交换&#…

解决NameError:name ‘file‘ is not defined 方法

方法1&#xff1a; import os base_diros.path.dirname(os.path.realpath(_file_) print(base_dir)方法2&#xff1a; import os base_diros.getcwd() print(base_dir)

PTA一笔画

作者 张志梅 单位 青岛大学 小丁最近迷恋上一个游戏&#xff0c;传说中的“一笔画”游戏。 那么什么是一笔画&#xff1f;如下图&#xff0c;顾名思义就是一笔可以完成的图。一笔画最基本的要求是在画图的过程中&#xff0c;笔不能离开纸&#xff0c;且笔所画过的线不能重复…

SAR ADC系列6——比较器输入失调电压仿真

ADC中比较器输入失调电压的仿真方法 比较器输入端输入一个共模电平&#xff08;1.65V&#xff09;&#xff0c;一个斜坡信号&#xff08;1.64V-1.66V&#xff09; 时序大概长下面这样 测量在发生翻转时的输入电压之间的差值&#xff0c;进行多次蒙特卡洛的仿真 用公式计算发…

【DNDC模型】土壤碳储量、温室气体排放、农田减排、土地变化、气候变化

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。国家领导人在多次重要会议上讲到&#xff0c;要把“双碳”纳入经济社会发展和生态文明建设整体布局。同时&#xff0c;提到要把减污降碳协同增效作为促…

mapstruct学习笔记-pojo之间的转换

1、前言 mapstruct中常用注解如Mapping,AfterMapping,BeanMapping等的使用,通过案例说明各式各样的业务pojo对象之间如何借助mapstruct完成相互之间的转换,减少代码量的同时也能突出业务逻辑流程,让你的代码里写起来更有规范可言。 2、简介 Reference Guide – MapStruct 3…

mysql中的非空间数据导入sqlserver中空间化

以下操作都在Navicat Premium 15软件中操作 1、mysql导出数据 以导出csv为例 不修改导出路径的话默认就是在桌面 设置编码UTF-8 这边还是默认,最好不要修改,如果文本识别符号为空,导入的时候可能字段会错乱 开始即可 2、导入sqlserver数据库中

排序——直接插入排序

排序之——直接插入排序 插入排序的基本思想 每次将一个待排序的记录按其关键字大小插入前面已经排好序的子序列&#xff0c;直到全部记录插入完成。 步骤&#xff08;从小到大排序&#xff09; 找到没有排序的元素标记元素将已排好序的序列中大于标记元素的往后移插入元素 …

从Excel到山海鲸:我的数据可视化升级之旅

作为一名新用户&#xff0c;我最近有幸体验了山海鲸可视化软件&#xff0c;近期山海鲸可视化产品开放了可视化编辑全部功能&#xff0c;并支持本地化部署功能&#xff0c;在使用过程中它不仅打开了我对数据可视化全新世界的大门&#xff0c;而且在实际操作中为我带来了不少惊喜…

深圳市蕾奥规划设计咨询股份有限公司入围《信用中国》栏目

为进一步推进商业信用体系建设,促进企业诚实守信经营,面向企业普及诚信与品牌建设的意义,指导企业加强诚信品牌建设,提升其整体竞争力,《信用中国》栏目组以诚信为内涵,在全国范围内遴选出有行业代表性的民营企业作为扶持对象,旨在通过大力宣传自主品牌,提高自主品牌影响力和认…

牛客NC241 计算器(二)【中等 dfs+双端队列 Java】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/a9c170bfaf7349e3acb475d786ab1c7d 核心 DFS双端队列参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定…

算法学习(持续更新中)

时间复杂度 一个操作如果和样本的数据量没有关系&#xff0c;每次都是固定时间内完成的操作&#xff0c;叫做常数操作。 时间复杂度为一个算法流程中&#xff0c;常数操作数量的一个指标。常用O&#xff08;读作big O&#xff09;来表示。具体来说&#xff0c;先要对一个算法…
最新文章