当前位置: 首页 > news >正文

【Flutter】基础入门:自定义Widget

在 Flutter 开发中,除了使用丰富的内置 Widgets 构建界面外,自定义 Widget 是让你的应用更灵活和个性化的重要手段。Flutter 允许你根据需求自定义 StatelessWidgetStatefulWidget,以实现复杂的 UI 组件或功能模块。

本教程将通过实例讲解如何自定义 Widget,帮助你掌握 Widget 的定义、状态管理、嵌套与复用,从而构建更灵活的 Flutter 界面。

什么是自定义 Widget

在 Flutter 中,Widget 是构建 UI 的基础,而自定义 Widget 允许开发者根据具体需求创建独特的组件。自定义 Widget 可以是简单的 UI 组合,也可以是包含复杂交互逻辑的组件。

通常,自定义 Widget 分为两类:

  • StatelessWidget:无状态的 Widget,通常用于静态显示,不需要更新 UI。
  • StatefulWidget:有状态的 Widget,可以根据用户交互或其他事件更新 UI。

自定义无状态 Widget (StatelessWidget)

无状态 Widget 是静态的,它们的显示不会随着时间或交互发生变化。

以下是一个简单的示例,演示如何创建并使用自定义的 StatelessWidget

import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('自定义 StatelessWidget 示例')),body: Center(child: MyCustomTextWidget(), // 使用自定义的无状态 Widget),),);}
}class MyCustomTextWidget extends StatelessWidget {Widget build(BuildContext context) {return Text('这是一个自定义的无状态 Widget',style: TextStyle(fontSize: 24, color: Colors.blue),);}
}

在这个示例中:

  • 我们创建了一个自定义的 StatelessWidget——MyCustomTextWidget,它只显示一行文字。
  • build 方法返回 Text Widget 来渲染具体的内容。

无状态 Widget 非常适合用于构建静态的 UI 元素,如文字、图标或静态布局。

自定义有状态 Widget (StatefulWidget)

有状态 Widget 可以根据用户的交互或内部状态改变 UI。它们比 StatelessWidget 更灵活,但同时也需要管理状态更新。

下面的示例展示如何创建一个自定义的 StatefulWidget,实现点击按钮后计数器递增的功能。

import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('自定义 StatefulWidget 示例')),body: Center(child: MyCounterWidget(), // 使用自定义的有状态 Widget),),);}
}class MyCounterWidget extends StatefulWidget {_MyCounterWidgetState createState() => _MyCounterWidgetState();
}class _MyCounterWidgetState extends State<MyCounterWidget> {int _counter = 0;void _incrementCounter() {setState(() {_counter++;});}Widget build(BuildContext context) {return Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Text('按钮点击次数:',),Text('$_counter',style: Theme.of(context).textTheme.headline4,),ElevatedButton(onPressed: _incrementCounter, // 点击按钮后计数器递增child: Text('增加计数'),),],);}
}

在这个例子中:

  • MyCounterWidget 是一个有状态的 Widget。
  • _counter 是 Widget 的状态,当点击按钮时,状态会通过 setState 方法更新,重新调用 build 方法,更新界面上的计数器值。

有状态 Widget 是构建动态、交互式 UI 的基础。它们允许开发者响应用户交互、时间事件等来动态更新界面。

组合与复用 Widget

Flutter 的 Widget 系统非常强大的一点就是它的组合性。我们可以通过将简单的 Widget 组合在一起,构建出复杂的 UI。

import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('组合自定义 Widgets')),body: Center(child: MyCustomCard(), // 使用自定义的组合 Widget),),);}
}class MyCustomCard extends StatelessWidget {Widget build(BuildContext context) {return Container(padding: EdgeInsets.all(16.0),decoration: BoxDecoration(color: Colors.blue[100],borderRadius: BorderRadius.circular(8.0),),child: Column(mainAxisSize: MainAxisSize.min,children: <Widget>[MyCustomTextWidget(),SizedBox(height: 10),MyCustomButtonWidget(),],),);}
}class MyCustomTextWidget extends StatelessWidget {Widget build(BuildContext context) {return Text('自定义文本 Widget',style: TextStyle(fontSize: 20, color: Colors.black87),);}
}class MyCustomButtonWidget extends StatelessWidget {Widget build(BuildContext context) {return ElevatedButton(onPressed: () {},child: Text('自定义按钮 Widget'),);}
}

在这个例子中:

  • 我们创建了一个组合 Widget MyCustomCard,它包含了两个自定义 Widget:MyCustomTextWidgetMyCustomButtonWidget
  • 通过组合不同的 Widget,可以轻松复用代码,并保持 UI 结构的清晰和简洁。

通过将简单的自定义 Widget 组合在一起,你可以构建出复杂的界面组件,保持代码的模块化和可复用性。

自定义 Widget 的实战应用

自定义 Widget 不仅仅用于显示简单的文本和按钮,它们可以用于实现更加复杂的 UI 和功能。比如,可以自定义输入框、卡片、动画组件,甚至是一个复杂的表单。

import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('自定义复杂布局')),body: Center(child: ProfileCard(), // 使用自定义的复杂布局 Widget),),);}
}class ProfileCard extends StatelessWidget {Widget build(BuildContext context) {return Card(elevation: 4.0,margin: EdgeInsets.all(16.0),child: Column(mainAxisSize: MainAxisSize.min,children: <Widget>[ListTile(leading: Icon(Icons.person, size: 50),title: Text('Flutter Developer'),subtitle: Text('Experience: 2 years'),),ButtonBar(children: <Widget>[TextButton(child: Text('View Profile'),onPressed: () {},),TextButton(child: Text('Contact'),onPressed: () {},),],),],),);}
}

在这个例子中:

  • ProfileCard 是一个复杂的自定义 Widget,包含头像、文字信息和按钮栏,模拟了一个用户个人资料卡片的布局。
  • 通过 CardListTile 等布局组件,可以构建出功能丰富且美观的界面。

总结

通过自定义 StatelessWidgetStatefulWidget,你可以轻松扩展 Flutter 的内置功能,创建复杂而灵活的 UI 组件。自定义 Widget 是开发 Flutter 应用程序的核心技能,无论是简单的文字显示还是复杂的用户交互,都可以通过自定义 Widget 来实现。

在开发中,注意保持 Widget 的复用性和模块化设计,这样可以提高代码的可读性和可维护性。在接下来的学习中,你可以尝试结合状态管理、动画等更高级的特性,进一步提升自定义 Widget 的能力。

相关文章:

【Flutter】基础入门:自定义Widget

在 Flutter 开发中&#xff0c;除了使用丰富的内置 Widgets 构建界面外&#xff0c;自定义 Widget 是让你的应用更灵活和个性化的重要手段。Flutter 允许你根据需求自定义 StatelessWidget 和 StatefulWidget&#xff0c;以实现复杂的 UI 组件或功能模块。 本教程将通过实例讲…...

程序员日志之DNF手游装备武器升级55级攻略

目录 传送门正文日志1、概要2、布甲3、皮甲4、轻甲5、重甲6、板甲7、武器 传送门 SpringMVC的源码解析&#xff08;精品&#xff09; Spring6的源码解析&#xff08;精品&#xff09; SpringBoot3框架&#xff08;精品&#xff09; MyBatis框架&#xff08;精品&#xff09; M…...

Java项目-基于springcloud框架的分布式架构网上商城系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…...

ComfyUI_LayerStyle节点介绍

✨原作者地址 ComfyUI_LayerStyle是一个很强大的节点组&#xff0c;支持了大量图像处理的基础节点。这篇是简单搬运和翻译原作者的内容&#xff0c;方便大家更方便快速的了解这个节点的价值。 https://github.com/chflame163/ComfyUI_LayerStyle ✨节点描述 节点根据功能分…...

SQL Injection | SQL 注入 —— 时间盲注

关注这个漏洞的其他相关笔记&#xff1a;SQL 注入漏洞 - 学习手册-CSDN博客 0x01&#xff1a;时间盲注 —— 理论篇 时间盲注&#xff08;Time-Based Blind SQL Injection&#xff09;是一种常见的 SQL 注入技术&#xff0c;适用于那些页面不会返回错误信息&#xff0c;只会回…...

最新开发项目H5商城小程序源码系统 带源代码安装包以及搭建部署教程

系统概述 在当今数字化迅猛发展的时代&#xff0c;电子商务已成为企业拓展市场、提升品牌影响力的重要手段。H5商城小程序作为一种跨平台、轻量级的应用形式&#xff0c;凭借其无需下载安装、即用即走的特性&#xff0c;迅速赢得了广大用户的青睐。为了满足企业对高质量H5商城…...

5大绝招揭秘:Cursor如何让RESTful API开发效率提升300%?

5大绝招揭秘:Cursor如何让RESTful API开发效率提升300%? 在当今快速迭代的软件开发世界中&#xff0c;高效构建RESTful API已成为开发者的必备技能。今天&#xff0c;我们将为大家介绍一款强大的AI辅助工具——Cursor&#xff0c;它能让您的API开发事半功倍。 Cursor Compos…...

鸿蒙开发,在 ArkTS 中,如何使用 Column 实现垂直居中对齐

面向万物互联时代&#xff0c;华为提出了“一次开发多端部署、可分可合自由流转、统一生态原生智能”三大应用与服务开发理念。针对多设备、多入口、服务可分可合等特性&#xff0c;华为提供了多种能力协助开发者降低开发门槛。HarmonyOS基于JS/TS语言体系&#xff0c;构建了全…...

红日安全vulnstack (一)

目录 环境搭建 本机双网卡 Kali IP 靶机IP Web GetShell 前期信息收集 Yxcms后台模板 Getshell PHPMyAdmin日志 Getshell into outfile写入一句话 X phpmyadmin 日志写入一句话 后渗透 MSF 生成木马上线 提取用户hash值 **hash**加密方式 MSF权限Shell至CS CS …...

为什么SSH协议是安全的?

SSH的传输层协议&#xff08;Transport Layer Protocol&#xff09;和用户鉴权协议&#xff08;Authentication Protocol&#xff09;确保数据的传输安全&#xff0c;这里只介绍传输层协议&#xff0c;是SSH协议的基础。 本文针对SSH2协议。 1、客户端连接服务器 服务器默认…...

主键 外键

主键 外键 在关系型数据库中&#xff0c;主键&#xff08;Primary Key&#xff09;和外键&#xff08;Foreign Key&#xff09;是用于维护数据完整性和建立表之间关系的重要概念。 主键&#xff08;Primary Key&#xff09; 定义: 主键是一个或多个列的组合&#xff0c;其值能…...

G - Road Blocked 2

G - Road Blocked 2 思路 只有当一条边是从 1 1 1到 n n n的所有最短路构成的图的桥时&#xff0c;去掉这条边&#xff0c;最短路才会变大 所以就可以用最短路加tarjan解决这道题了 怎么判断一条边是否可以构成最短路呢&#xff0c;比如求 1 1 1到 n n n的最短路&#xff0…...

R语言绘制Venn图(文氏图、温氏图、维恩图、范氏图、韦恩图)

Venn图&#xff0c;又称文氏图&#xff0c;标题中其他名字也是它的别称&#xff0c;由封闭圆形组成&#xff0c;代表不同集合。圆形重叠部分表示集合交集&#xff0c;非重叠处为独有元素。在生物学、统计学等领域广泛应用&#xff0c;可展示不同数据集相似性与差异&#xff0c;…...

【Vue.js】vue2 项目在 Vscode 中使用 Ctrl + 鼠标左键跳转 @ 别名导入的 js 文件和 .vue 文件

js 文件跳转 需要安装插件 Vetur 然后需要我们在项目根目录下添加 jsconfig.json 配置&#xff0c;至于配置的作用&#xff0c;可以参考我的另外一篇博客&#xff1a; 【React 】react 创建项目配置 jsconfig.json 的作用 它主要用于配置 JavaScript 或 TypeScript 项目的根…...

NVM配置与Vue3+Vite项目快速搭建指南

本文目录 1、配置环境1.1 NVM1、nvm常用命令 1.2 Mac配置环境1、安装nvm 1.3 Window配置环境1、安装nvm 2、 项目搭建2.1 项目依赖2.2 安装依赖2.3 配置1、别名配置2、创建样式及图片文件夹3、路由 2.4 项目搭建效果2.5 项目结构 在当今快速发展的前端技术领域中&#xff0c;掌…...

面试“利器“——微学时光

大家好&#xff0c;我是程序员阿药。微学时光是一款专为计算机专业学生和IT行业求职者设计的面试刷题小程序&#xff0c;它汇集了丰富的计算机面试题和知识点&#xff0c;旨在帮助用户随时随地学习和复习&#xff0c;提高自身的技术能力和面试技巧。 主题 随时随地学习&#x…...

【Unity】【游戏开发】游戏引擎是如何模拟世界的

【核心感悟】 游戏引擎通过两个维度的合并来模拟这个时间。 一个维度叫物理模型。 一个维度叫视觉模型。 对于物理模型&#xff0c;我们需要用物理引擎给予行为。 对于视觉模型&#xff0c;我们需要用动画去给予行为。 物理模型是真实机制&#xff0c;视觉模型是艺术表现&…...

vscode配置conda虚拟环境【windows系统】

安装好anacondavscode里安装python插件 3.点击左侧插件 如图1&#xff0c;再2&#xff0c;再点击3小星星激活conda环境 最后下方栏就出现conda环境了。就可以用啦...

libgpiod在imx8平台交叉编译说明

如下记录是在 imx8上测试使用 参考博主的文章 iMX6ULL 库移植 | Libgpiod 库的交叉编译及使用指南(linux) 编译说明 1: build.sh代码如下所示&#xff0c;先执行 source build.sh&#xff0c;注意修改交叉编译工具链为自己本地的地址&#xff1b; 2&#xff1a;执行 ./autogen…...

无人机之自主飞行关键技术篇

无人机自主飞行指的是无人机利用先进的算法和传感器&#xff0c;实现自我导航、路径规划、环境感知和自动避障等能力。这种飞行模式大大提升了无人机的智能化水平和操作的自动化程度。 一、传感器技术 传感器是无人机实现自主飞行和数据采集的关键组件&#xff0c;主要包括&a…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...