深入理解并解析Flutter Widget

image.png

文章目录

      • 完整代码
      • 程序入口
      • 构建 Widget 结构
      • 定义 widget 状态
      • 定义 widget UI
        • 获取上下文
        • 关于build()
        • build() 常用使用

完整代码

import 'package:english_words/english_words.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return ChangeNotifierProvider(create: (context) => MyAppState(),child: MaterialApp(title: 'Namer App',theme: ThemeData(useMaterial3: true,colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepOrange),),home: MyHomePage(),),);}
}class MyAppState extends ChangeNotifier {var current = WordPair.random();var title = "Hello Flutter";void getTitle() {title = "Hello Flutter , I learn Mobile env";print(title);notifyListeners();  //通知 watch widget   更新}}class MyHomePage extends StatelessWidget {Widget build(BuildContext context) {var appState = context.watch<MyAppState>();return Scaffold(body: Column( children: [Text('A random idea:'),Text(appState.current.asLowerCase),Text(appState.title),ElevatedButton(onPressed: () {// print('button pressed!');appState.getTitle();},child: Text('Next'),),],),);}
}

程序入口

通过 main 函数只是告知 Flutter 运行 MyApp 中定义的应用。

void main() {runApp(MyApp());
}

该函数只是告知 Flutter 运行 MyApp 中定义的应用。

构建 Widget 结构

MyApp 类扩展 StatelessWidget。在构建每一个 Flutter 应用时,widget 都是一个基本要素。如您所见,应用本身也是一个 widget。
MyApp 中的代码设置了整个应用,包括创建应用级状态、命名应用、定义视觉主题以及设置“主页” widget,即应用的起点。

class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return ChangeNotifierProvider(create: (context) => MyAppState(),child: MaterialApp(title: 'Namer App',theme: ThemeData(useMaterial3: true,colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepOrange),),home: MyHomePage(),),);}
}

定义 widget 状态

我们可以定义状态类,来创建 widget 的状态 和事件通信,然后通过 状态类扩展 来更新 widget

class MyAppState extends ChangeNotifier {var current = WordPair.random();var title = "Hello Flutter";void getTitle() {title = "Hello Flutter , I learn Mobile env";print(title);notifyListeners();  //通知 watch widget   更新}
}

定义 widget UI

  • 每个 widget都会有一个 build 方法,用于构建和返回 Widget 树。 每当 widget 的环境发生变化时,系统都会自动调用该方法,以便 widget 始终保持最新状态。
  • MyHomePage 使用 watch 方法跟踪对应用当前状态的更改。
class MyHomePage extends StatelessWidget {Widget build(BuildContext context) {var appState = context.watch<MyAppState>();return Scaffold(body: Column( children: [Text('A random idea:'),Text(appState.current.asLowerCase),Text(appState.title),ElevatedButton(onPressed: () {appState.getTitle();},child: Text('Next'),),],),);}
}
获取上下文

通过context.watch

 var appState = context.watch<MyAppState>();
关于build()

Widget build(BuildContext context) {}
  • build 方法接收一个BuildContext 参数,它提供了与当前 Widget 相关的上下文信息,例如父级 Widget 的信息、主题数据等。
  • build 方法的作用是根据当前的状态(State)和输入属性(Properties)构建并返回一个 Widget 树。这个 Widget 树描述了界面的结构和外观。Flutter 框架会根据这个 Widget 树来绘制界面,并在需要时进行重建和更新。
  • 在 build 方法中,你可以使用各种 Flutter 提供的 Widget 来构建界面,例如 Container、Text、Image 等。你还可以使用自定义的 Widget 来组合和嵌套,以创建复杂的界面布局。

除了基本的 BuildContext 参数之外,build 方法还可以接收其他参数,这些参数可以根据需要进行传递。例如,你可以将一些配置参数或回调函数作为参数传递给自定义的 Widget,并在 build 方法中使用它们来影响界面的构建过程。

build() 常用使用
  1. 直接返回一个 Widget,例如:
Widget build(BuildContext context) {return Container(// 定义容器的属性和子 Widget);
}
  1. 使用条件语句或循环来动态构建不同的 Widget 树,例如:
Widget build(BuildContext context) {if (condition) {return Text('Condition is true');} else {return Text('Condition is false');}
}
  1. 使用 Builder 模式构建复杂的 Widget 树,例如:
Widget build(BuildContext context) {return Builder(builder: (BuildContext context) {// 在这里构建并返回复杂的 Widget 树},);
}

image.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抖音在线查权重系统源码,附带查询接口

抖音权重在线查询只需输入抖音主页链接&#xff0c;即可查询作品情况。 搭建教程 上传源码并解压 修改数据库“bygoukai.sql” 修改“config.php” 如需修改水印请修改第40行 如需修改限制次数&#xff0c;请修改第156行 访问域名user.php即可查看访问用户&#xff0c;停…

2023年度总结:技术沉淀、持续学习

2023年度总结&#xff1a;技术沉淀、持续学习 一、引言 今年是我毕业的第二个年头&#xff0c;也是完整的一年&#xff0c;到了做年终总结的时候了 这一年谈了女朋友&#xff0c;学习了不少技术&#xff0c;是充实且美好的一年&#xff01; 首先先看年初定的小目标&#xf…

第二次面试总结 - 宏汉科技 - Java后端开发

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对博主首页也很感兴趣o (ˉ▽ˉ&#xff1b;) 博主首页&#xff0c;更多redis、java等优质好文以及各种保姆级教程等您挖掘&#xff01; 目录 总结 (非详细) 面试内容(提问内容) - 带答案 1、字符串相…

多文件上传

HTML中实现多文件上传是通过用<input type"file">元素的multiple属性&#xff0c;以下简单描述多文件上传的步骤 HTML表单准备&#xff0c;使用<input type"file">元素&#xff0c;并为其添加multiple属性&#xff0c;以允许用户选择多个文件…

管理系统-基于javaweb的图书管理系统

基于javaweb的图书管理系统 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 本项目采用eclipse工具开发&#xff0c;jspservlet技术编写&#xff0c;样式采用了layui…

2022年全国职业院校技能大赛软件测试赛题卷②—自动化测试解析报告(含术语)

2022年全国职业院校技能大赛软件测试任务四 自动化测试 目录 第一题:按照以下步骤在PyCharm中进行自动化测试脚本编写,并执行脚本。

一、二进制方式 安装部署K8S

目录 一、操作系统初始化 1、关闭防火墙 2、关闭 SELinu 3、 关闭 swap 4、添加hosts 5、同步系统时间 二、集群搭建 —— 使用外部Etcd集群 1、自签证书 2、自签 Etcd SSL 证书 ① 创建 CA 配置文件&#xff1a;ca-config.json ② 创建 CA 证书签名请求文件&#xff…

Golang 结构体

前言 在 Go 语言中&#xff0c;结构体&#xff08;struct&#xff09;是一种自定义的数据类型&#xff0c;将多个不同类型的字段&#xff08;fields&#xff09;组合在一起 结构体通常用于模拟真实世界对象的属性和行为 定义结构体 可以使用 type 关键字和 struct 关键字来定…

C++笔记之cout高亮输出以及纯C++实现一个彩色时钟

C笔记之cout高亮输出以及纯C实现一个彩色时钟 code review! 文章目录 C笔记之cout高亮输出以及纯C实现一个彩色时钟一.cout高亮输出1.1.运行1.2.代码一1.3.代码二1.4.重置终端的文本格式到默认设置说明 二.纯C实现一个彩色时钟2.1.运行2.2.main.cc2.3.cout带颜色打印输出技巧…

[ffmpeg系列 03] 文件、流地址(视频)解码为YUV

一 代码 ffmpeg版本5.1.2&#xff0c;dll是&#xff1a;ffmpeg-5.1.2-full_build-shared。x64的。 文件、流地址对使用者来说是一样。 流地址(RTMP、HTTP-FLV、RTSP等)&#xff1a;信令完成后&#xff0c;才进行音视频传输。信令包括音视频格式、参数等协商。 接流的在实际…

基于实时Linux+FPGA实现NI CompactRIO系统详解

利用集成的软件工具链&#xff0c;结合信号调理I/O模块&#xff0c;轻松构建和部署实时应用程序。 什么是CompactRIO&#xff1f; CompactRIO系统提供了高处理性能、传感器专用I/O和紧密集成的软件工具&#xff0c;使其成为工业物联网、监测和控制应用的理想之选。实时处理器提…

e2studio开发LPS28DFW气压计(1)----轮询获取气压计数据

e2studio开发LPS28DFW气压计.1--轮询获取气压计数据 概述视频教学样品申请完整代码下载产品特性通信模式速率新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user…

css3 transform:scale

transform:scale 语法&#xff1a;transform:scale(x,y); <html> <head><style>.box1 {display: inline-block;width: 200px;height: 200px;background-color: pink;}.box2 {display: inline-block;width: 200px;height: 200px;background-color: red;tran…

Leetcode 3701 · Find Nearest Right Node in Binary Tree (遍历和BFS好题)

3701 Find Nearest Right Node in Binary TreePRE Algorithms This topic is a pre-release topic. If you encounter any problems, please contact us via “Problem Correction”, and we will upgrade your account to VIP as a thank you. Description Given a binary t…

XDOJ175.窗口模拟

标题 窗口模拟 类别 综合 时间限制 2S 内存限制 256Kb 问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域。窗口的边界上的点也属于该窗口。 窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶…

VMware NAT 模式,网关无法ping通 网关解决办法

开启红框服务即可。。 参考&#xff1a;VMware NAT 模式&#xff0c;网关无法ping通 网关解决办法_vmware设置net,本机ping不通网关-CSDN博客

多功能号卡推广分销管理系统 流量卡推广分销网站源码-目前市面上最优雅的号卡系统

一套完善,多功能,的号卡分销系统,多接口,包括运营商接口,无限三级代理,最简单易用的PHP~ 目前市面上最优雅的号卡系统!没有之一 软件架构说明 环境要求php7.3以上(建议低于8.0),MySQL5.6以上,Nginx1.16(无要求) 产品特性 自动安装向导 易于安装使用部署 多个第…

【第10讲】微信机器人 · 智能聊天

系列文章目录 第1讲:软件下载和安装第2讲:发消息第3讲:发文件第4讲:关键词回复第5讲:自定义功能第6讲:定时群发第7讲:获取群信息第8讲:自动加好友第9讲:桌面版第10讲:

网络安全学习资源

好久没写博客了&#xff0c;记录一些宝藏学习资源&#xff0c;不定时更新 Regex Learn - Step by step, from zero to advanced. 这是一个我认为最好的正则表达式学习网站&#xff0c;很多正则表达式学习资料都只提供了一个概念&#xff0c;但是正则表达式需要大量的练习&#…

MBTI职业性格测试 28题(免费版)

MBTI职业性格测试概述 MBTI是现在国际上最为流行的测试工具&#xff0c;利用MBTI职业性格测试&#xff0c;可以清楚地找到自己的性格特点以及兴趣爱好&#xff0c;方便于对职业进行规划、以及改善人际关系。其主要应用心理学常识对个性做出判断&#xff0c;提炼出动力、信息收…