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

Flutter Widgets组件详解:从基础到高级

Flutter Widgets组件详解从基础到高级一、Widget基础概念在Flutter中一切都是Widget。Widget是Flutter应用的基本构建块它们描述了UI在某个特定时刻的外观。Flutter的Widget树是应用界面的核心结构。1.1 Widget的分类Flutter Widget主要分为两类Stateless Widget- 无状态组件class MyStatelessWidget extends StatelessWidget { final String title; const MyStatelessWidget({super.key, required this.title}); override Widget build(BuildContext context) { return Text(title); } }Stateful Widget- 有状态组件class MyStatefulWidget extends StatefulWidget { const MyStatefulWidget({super.key}); override StateMyStatefulWidget createState() _MyStatefulWidgetState(); } class _MyStatefulWidgetState extends StateMyStatefulWidget { int _counter 0; void _increment() { setState(() { _counter; }); } override Widget build(BuildContext context) { return Column( children: [ Text(Counter: $_counter), ElevatedButton(onPressed: _increment, child: const Text(Increment)), ], ); } }1.2 Widget树的结构MaterialApp( // 根Widget home: Scaffold( // 页面骨架 appBar: AppBar( // 顶部导航栏 title: Text(Title), ), body: Center( // 居中布局 child: Text(Hello World), ), ), )二、布局Widget详解2.1 Container - 容器组件Container是最常用的布局组件提供了padding、margin、背景色等功能。Container( width: 200, height: 100, margin: const EdgeInsets.all(16), padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), decoration: BoxDecoration( color: Colors.blue, borderRadius: BorderRadius.circular(8), boxShadow: const [ BoxShadow( color: Colors.black12, blurRadius: 4, offset: Offset(2, 2), ), ], ), child: const Text( Container, style: TextStyle(color: Colors.white), ), )2.2 Row和Column - 线性布局Row- 水平布局Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: const [ Icon(Icons.home), Text(Home), Icon(Icons.settings), ], )Column- 垂直布局Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start, children: const [ Text(Title), Text(Subtitle), Text(Description), ], )2.3 Flex和Expanded - 弹性布局Row( children: [ Expanded( flex: 2, child: Container(color: Colors.red), ), Expanded( flex: 1, child: Container(color: Colors.blue), ), Expanded( flex: 1, child: Container(color: Colors.green), ), ], )2.4 Stack - 层叠布局Stack( alignment: Alignment.center, children: [ Container( width: 200, height: 200, color: Colors.blue, ), const Text( Centered, style: TextStyle(color: Colors.white, fontSize: 24), ), Positioned( top: 10, right: 10, child: const Icon(Icons.star, color: Colors.yellow), ), ], )2.5 Wrap - 流式布局Wrap( spacing: 8, runSpacing: 8, children: [ for (int i 0; i 10; i) Chip( label: Text(Tag $i), backgroundColor: Colors.grey[200], ), ], )三、Material Design Widget3.1 AppBar - 应用栏AppBar( title: const Text(My App), leading: const Icon(Icons.menu), actions: [ IconButton( icon: const Icon(Icons.search), onPressed: () {}, ), IconButton( icon: const Icon(Icons.more_vert), onPressed: () {}, ), ], elevation: 4, backgroundColor: Colors.blue, )3.2 FloatingActionButton - 悬浮按钮FloatingActionButton( onPressed: () {}, child: const Icon(Icons.add), backgroundColor: Colors.blue, elevation: 4, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), )3.3 Card - 卡片组件Card( elevation: 4, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), child: Padding( padding: const EdgeInsets.all(16), child: Column( children: const [ Icon(Icons.person, size: 48), SizedBox(height: 12), Text(John Doe), Text(johnexample.com), ], ), ), )3.4 ListTile - 列表项ListTile( leading: const CircleAvatar( backgroundImage: NetworkImage(https://example.com/avatar.jpg), ), title: const Text(John Doe), subtitle: const Text(Online), trailing: const Icon(Icons.arrow_forward_ios), onTap: () {}, )3.5 Button组件// ElevatedButton - 凸起按钮 ElevatedButton( onPressed: () {}, style: ElevatedButton.styleFrom( backgroundColor: Colors.blue, padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 12), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), ), child: const Text(Submit), ) // OutlinedButton - 描边按钮 OutlinedButton( onPressed: () {}, style: OutlinedButton.styleFrom( side: const BorderSide(color: Colors.blue), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), ), child: const Text(Cancel), ) // TextButton - 文字按钮 TextButton( onPressed: () {}, child: const Text(Learn More), )四、文本和输入Widget4.1 Text - 文本组件const Text( Hello Flutter, style: TextStyle( fontSize: 24, fontWeight: FontWeight.bold, color: Colors.blue, fontStyle: FontStyle.italic, decoration: TextDecoration.underline, letterSpacing: 2, height: 1.5, ), textAlign: TextAlign.center, maxLines: 2, overflow: TextOverflow.ellipsis, )4.2 RichText - 富文本RichText( text: TextSpan( style: DefaultTextStyle.of(context).style, children: const [ TextSpan( text: Hello , style: TextStyle(fontWeight: FontWeight.bold), ), TextSpan( text: Flutter, style: TextStyle(color: Colors.blue), ), TextSpan( text: World!, style: TextStyle(fontStyle: FontStyle.italic), ), ], ), )4.3 TextField - 文本输入框TextField( decoration: InputDecoration( labelText: Username, hintText: Enter your username, prefixIcon: const Icon(Icons.person), border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), ), focusedBorder: OutlineInputBorder( borderSide: const BorderSide(color: Colors.blue), borderRadius: BorderRadius.circular(8), ), ), keyboardType: TextInputType.emailAddress, textInputAction: TextInputAction.next, onChanged: (value) { // Handle input changes }, )4.4 TextFormField - 带验证的文本输入TextFormField( decoration: const InputDecoration( labelText: Email, hintText: Enter your email, ), validator: (value) { if (value null || value.isEmpty) { return Please enter your email; } final emailRegex RegExp(r^[\w-\.]([\w-]\.)[\w-]{2,4}$); if (!emailRegex.hasMatch(value)) { return Please enter a valid email; } return null; }, )五、图像和图标Widget5.1 Image - 图片组件// 从网络加载 Image.network( https://example.com/image.jpg, width: 200, height: 200, fit: BoxFit.cover, loadingBuilder: (context, child, loadingProgress) { if (loadingProgress null) return child; return const Center( child: CircularProgressIndicator(), ); }, errorBuilder: (context, error, stackTrace) { return const Icon(Icons.error); }, ) // 从本地资产加载 Image.asset( assets/images/logo.png, width: 100, height: 100, )5.2 Icon - 图标组件const Icon( Icons.home, size: 32, color: Colors.blue, ) // 使用自定义图标字体 Icon( IconData(0xe900, fontFamily: MyIcons), size: 32, )5.3 IconButton - 图标按钮IconButton( icon: const Icon(Icons.favorite), iconSize: 24, color: Colors.red, onPressed: () {}, splashRadius: 20, )六、滚动Widget6.1 SingleChildScrollView - 单子滚动SingleChildScrollView( child: Column( children: [ for (int i 0; i 50; i) ListTile( title: Text(Item $i), ), ], ), )6.2 ListView - 列表视图// ListView.builder - 按需构建 ListView.builder( itemCount: 100, itemBuilder: (context, index) { return ListTile( title: Text(Item $index), ); }, ) // ListView.separated - 带分隔线 ListView.separated( itemCount: 100, separatorBuilder: (context, index) const Divider(), itemBuilder: (context, index) { return ListTile( title: Text(Item $index), ); }, )6.3 GridView - 网格视图GridView.count( crossAxisCount: 2, crossAxisSpacing: 8, mainAxisSpacing: 8, padding: const EdgeInsets.all(16), children: [ for (int i 0; i 12; i) Container( color: Colors.blue[100], child: Center(child: Text(Grid $i)), ), ], ) // GridView.builder GridView.builder( gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, crossAxisSpacing: 8, mainAxisSpacing: 8, ), itemCount: 100, itemBuilder: (context, index) { return Container( color: Colors.blue[100], child: Center(child: Text(Grid $index)), ); }, )七、对话框和弹窗Widget7.1 AlertDialog - 警告对话框showDialog( context: context, builder: (context) AlertDialog( title: const Text(Confirm), content: const Text(Are you sure you want to delete?), actions: [ TextButton( onPressed: () Navigator.pop(context), child: const Text(Cancel), ), ElevatedButton( onPressed: () { // Handle delete Navigator.pop(context); }, child: const Text(Delete), ), ], ), )7.2 SimpleDialog - 简单对话框showDialog( context: context, builder: (context) SimpleDialog( title: const Text(Select Option), children: [ SimpleDialogOption( onPressed: () { Navigator.pop(context, Option 1); }, child: const Text(Option 1), ), SimpleDialogOption( onPressed: () { Navigator.pop(context, Option 2); }, child: const Text(Option 2), ), ], ), )7.3 SnackBar - 轻量级提示ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: const Text(Message sent successfully), duration: const Duration(seconds: 2), action: SnackBarAction( label: Undo, onPressed: () {}, ), ), )八、自定义Widget8.1 创建自定义StatelessWidgetclass CustomButton extends StatelessWidget { final String text; final VoidCallback onPressed; final Color? color; const CustomButton({ super.key, required this.text, required this.onPressed, this.color, }); override Widget build(BuildContext context) { return ElevatedButton( onPressed: onPressed, style: ElevatedButton.styleFrom( backgroundColor: color ?? Theme.of(context).primaryColor, padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), ), child: Text( text, style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w500), ), ); } }8.2 创建自定义StatefulWidgetclass CounterWidget extends StatefulWidget { const CounterWidget({super.key}); override StateCounterWidget createState() _CounterWidgetState(); } class _CounterWidgetState extends StateCounterWidget { int _count 0; void _increment() setState(() _count); void _decrement() setState(() _count--); void _reset() setState(() _count 0); override Widget build(BuildContext context) { return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( $_count, style: const TextStyle(fontSize: 48), ), const SizedBox(height: 16), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ IconButton(onPressed: _decrement, icon: const Icon(Icons.remove)), const SizedBox(width: 16), CustomButton(text: Reset, onPressed: _reset), const SizedBox(width: 16), IconButton(onPressed: _increment, icon: const Icon(Icons.add)), ], ), ], ); } }九、Widget生命周期9.1 StatefulWidget生命周期方法class LifecycleDemo extends StatefulWidget { const LifecycleDemo({super.key}); override StateLifecycleDemo createState() _LifecycleDemoState(); } class _LifecycleDemoState extends StateLifecycleDemo { override void initState() { super.initState(); // 初始化状态只调用一次 } override void didChangeDependencies() { super.didChangeDependencies(); // 依赖变化时调用 } override void didUpdateWidget(covariant LifecycleDemo oldWidget) { super.didUpdateWidget(oldWidget); // Widget更新时调用 } override Widget build(BuildContext context) { // 构建UI return const Placeholder(); } override void dispose() { // 清理资源 super.dispose(); } }十、最佳实践10.1 Widget组合优于继承// 推荐组合现有Widget class UserAvatar extends StatelessWidget { final String url; final double size; const UserAvatar({super.key, required this.url, this.size 48}); override Widget build(BuildContext context) { return CircleAvatar( radius: size / 2, backgroundImage: NetworkImage(url), ); } }10.2 提取复杂Widget// 避免build方法过于庞大 Widget _buildUserCard(User user) { return Card( child: ListTile( leading: UserAvatar(url: user.avatarUrl), title: Text(user.name), subtitle: Text(user.email), ), ); }10.3 使用const构造函数// 对于不变的Widget使用const const Text(Hello World); // 优化性能10.4 合理使用KeyListView.builder( itemBuilder: (context, index) { return ListTile( key: UniqueKey(), // 或ValueKey(item.id) title: Text(Item $index), ); }, )总结Flutter的Widget系统是其核心优势之一。通过合理组合和使用各种Widget你可以构建出丰富多样的UI界面。关键要点理解Widget树结构掌握Container、Row、Column、Stack等基础布局Widget合理选择Widget类型根据场景选择Stateless或Stateful Widget善用Material Design组件AppBar、Card、Button等组件能快速构建美观界面性能优化使用ListView.builder、const构造函数等优化渲染性能代码组织将复杂UI提取为独立Widget保持代码清晰继续探索更多Widget和最佳实践你将能够构建出更加精美和高效的Flutter应用。

相关文章:

Flutter Widgets组件详解:从基础到高级

Flutter Widgets组件详解:从基础到高级 一、Widget基础概念 在Flutter中,一切都是Widget。Widget是Flutter应用的基本构建块,它们描述了UI在某个特定时刻的外观。Flutter的Widget树是应用界面的核心结构。 1.1 Widget的分类 Flutter Widget主…...

CSS伪类详解:从基础到高级应用

CSS伪类详解:从基础到高级应用 一、什么是CSS伪类 CSS伪类是一种选择器,用于选择处于特定状态的元素。它们以冒号 : 开头,可以为元素的不同状态设置不同的样式。伪类的强大之处在于它们能够根据用户交互、文档结构或元素状态来动态改变样式&a…...

通过Taotoken CLI工具一键配置团队开发环境与统一模型调用

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过Taotoken CLI工具一键配置团队开发环境与统一模型调用 在团队协作开发中,统一管理大模型API的接入配置是一项常见且…...

Flutter国际化与本地化完全指南

Flutter国际化与本地化完全指南 引言 国际化是构建全球化应用的关键环节,Flutter提供了完善的国际化支持。本文将深入探讨Flutter中的国际化和本地化技术。 一、基础配置 1.1 添加依赖 dependencies:flutter_localizations:sdk: flutterintl: ^0.18.11.2 更新main.d…...

CSS背景效果完全指南

CSS背景效果完全指南 引言 CSS背景效果是美化网页的重要手段,通过合理使用背景属性,可以创造出丰富的视觉效果。本文将深入探讨CSS背景的各种属性和高级技巧。 一、背景基础 1.1 background-color .element {background-color: #4CAF50;background-color…...

2026免费一键去图片水印App详细教程,哪个好用一看就会

你是不是也遇到过这种抓狂瞬间:好不容易找到一张绝美壁纸,下载下来发现右下角有个硕大的水印;刷小红书看到一张干货满满的食谱长图,想保存下来慢慢看,结果水印刚好盖在关键步骤上;又或者自己做图时手滑把水…...

144-基于Flask的电商超市数据可视化分析系统

基于 Flask 的电商超市数据可视化分析系统 — 技术文档 目录 项目概述技术栈项目结构系统架构数据库设计后端路由设计数据分析引擎前端页面设计API 接口文档用户认证与权限管理后台部署与运行依赖清单 1. 项目概述 本系统是一个基于 Flask 框架的电商超市数据可视化分析平台…...

Codeforces Round 1058

【实况】Codeforces Round 1058 (Div. 2)(rk3194;perf1423;solve3) https://www.bilibili.com/video/BV1Tv4GzwE5r/ 【赛时3/7】Codeforces Round 1058(Div.2)上1000了记录一下 https://www.bilibili.com/video/BV1BC4kzMEoa/ Codeforces Round 1058 (Di…...

2026最新免费图片去水印工具详细教程丨手把手教会你,一看就会

你是不是也遇到过这样的抓狂时刻:相册里翻到一张超好看的壁纸,刚想设成桌面,角落那个大大的水印瞬间让人没了心情;做课件做汇报,急需一张干净的产品图,翻遍全网不是带标的就是要付费;刷视频看到…...

Kubernetes成本优化与资源管理:降低云原生基础设施成本

Kubernetes成本优化与资源管理:降低云原生基础设施成本 一、成本优化概述 Kubernetes成本优化是通过合理配置资源、优化调度策略、选择合适的实例类型等方式,降低云原生基础设施的运营成本。 1.1 成本组成 成本类型说明优化方向计算成本CPU、内存资源…...

Kubernetes事件驱动架构设计:构建响应式微服务系统

Kubernetes事件驱动架构设计:构建响应式微服务系统 一、事件驱动架构概述 事件驱动架构(EDA) 是一种设计模式,其中系统的行为由事件触发。在Kubernetes环境中,事件驱动架构可以实现松耦合、高可扩展的微服务系统。 …...

Linux渗透测试实战命令指南:从信息收集到横向移动

1. 这不是命令手册,而是一张渗透测试现场的“作战地图”你有没有过这样的经历:坐在靶机前,刚扫出一个Web服务,脑子里立刻蹦出七八个工具名——nmap、gobuster、sqlmap、hydra……可手一伸向键盘,却卡在了第一个参数上&…...

Linux端口敲门原理与knockd实战部署指南

1. 端口敲门不是玄学,是可控的“隐形门铃”很多人第一次听说“SSH端口敲门”,第一反应是:这玩意儿是不是给服务器加了一把看不见的锁?听起来很酷,但真用起来会不会像在黑盒里调音——敲对了门开,敲错了直接…...

AWVS 25.5 Windows版深度部署指南:CVE精准验证与DevSecOps集成

1. 这不是普通安装教程:AWVS 25.5 Windows版的真实价值在哪?很多人搜“AWVS安装教程”,点进来第一反应是“又要填注册码、改hosts、下破解补丁?”——这种认知已经严重落后于2025年的真实技术现场。我用AWVS 25.5在三个不同行业的…...

2026年AI论文写作工具实测认证:5款神器从文献到降重一站式避坑指南

写论文的焦虑,是每个科研人和学生绕不开的“必修课”。选题无从下手,文献检索耗时费力,格式调整反复修改,查重降重更是让人抓耳挠腮。2026年的AI工具早已不是当年的“辅助软件”,而是升级为能理解学术逻辑、生成高质量…...

2026年AI论文写作软件盘点:12款神器助你高效完成去痕改写、润色和过检

随着 AI 技术的持续突破,2026 年的论文写作工具市场已进入“智能化、精细化、合规化”的全新发展阶段。从本科生的课程论文到研究生的学位论文,再到科研人员的期刊投稿,AI 工具正以强大的技术支撑覆盖各类学术场景。无论是选题方向的启发、文…...

《当下的力量》7-10章终章解读:从临在到臣服,活出生命的终极自由

《当下的力量》7-10章终章解读:从临在到臣服,活出生命的终极自由终章:这是全书最具力量的部分,它将告诉你如何在最艰难的人生境遇中,依然保持内心的平静与自由前言 在前六章中,我们已经了解了人类痛苦的根源…...

Python算法基础篇之广度优先搜索(BFS)

一、什么是广度优先搜索(BFS)? 广度优先搜索(Breadth-First Search, BFS) 是一种用于遍历或搜索图、树的算法。其核心策略是:从起始节点出发,先访问所有直接邻居(第1层)&…...

Python算法基础篇之深度优先搜索(DFS)

一、什么是深度优先搜索(DFS)? 深度优先搜索(Depth-First Search, DFS) 是一种用于遍历或搜索图、树的算法。其核心策略是:从起始节点出发,沿着一条路径尽可能深入地探索,直到无法继…...

信创中间件深度解析:东方通TongWeb vs 金蝶天燕 vs 宝兰德,企业级选型指南

📚 信创中间件 🔧 企业级部署 🚀 国产化替代 ⏱️ 阅读约15分钟开篇导读:你是否在信创改造中不知道用什么替代WebLogic或WebSphere?网上搜到的中间件资料要么只讲产品功能不讲迁移方案,要么直接给配置却不解…...

中小企业AI落地成本杀手!DeepSeek计费冷知识曝光(含4个可立即启用的免费优化开关)

更多请点击: https://codechina.net 第一章:中小企业AI落地成本杀手!DeepSeek计费冷知识曝光(含4个可立即启用的免费优化开关) 很多中小企业误以为调用 DeepSeek API 的成本仅取决于 token 数量,却忽略了隐…...

网络技术05-TCP拥塞控制算法——从CUBIC到BBR的性能进化

🚗 一句话总结:TCP拥塞控制就像开车——看到前面堵车就减速(拥塞避免),路通畅了就慢慢加速(慢启动)。CUBIC是"看到堵车就猛踩刹车",BBR是"根据路况预测提前调整"…...

eClinMed 中国人民解放军总医院第五医学中心介入超声科:基于超声的可解释性机器学习模型用于≤3cm肝细胞癌分类的开发与验证

01文献信息本次分享的文献是由中国人民解放军总医院第五医学中心介入超声科联合厦门大学附属翔安医院、南开大学医学院和福州市第一总医院超声科等55家医院在2025年2月在柳叶刀子刊《eClinicalMedicine》(中科院1区,IF10.0)上的研究“Develop…...

J Thorac Oncol(IF=20.8)广东省人民医院钟文昭教授团队:基于影像组学的支持向量机区分驱动肺腺癌进展的分子事件

01文献信息本次分享的文献是由广东省人民医院肺癌研究所钟文昭教授团队联合华南理工大学医学院、广东省人民医院病理科、核医学科等多学科团队在2024年9月19日在《Journal of Thoracic Oncology》(中科院1区,IF20.8)上发表的研究“Radiomics-…...

Claude Code 2026 全命令实战:6分钟开发完整坦克对战游戏

文章目录前言第一步:新建文件夹,然后输入一个单词第二步:/plan命令,比产品经理还贴心的规划师第三步:看着AI写代码,自己在旁边喝咖啡第四步:/rewind命令,程序员的后悔药第五步&#…...

深度剖析Claude Code实操逻辑,解锁AI编程高效开发方式

文章目录前言一、我用Claude Code的翻车现场,能写一本《程序员血泪史》二、Claude Code的核心设计思想:你以为它是保姆,其实它是保安三、普通模式vs规划模式:一个是临时工,一个是项目经理四、两条核心指令,…...

掌握AI技能配置技巧 大幅提升日常办公开发效率

P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能…...

量子机器学习模型安全:反向工程威胁与防御策略解析

1. 量子机器学习模型的反向工程:安全威胁与防御策略量子计算与机器学习的结合,正以前所未有的方式重塑我们处理复杂问题的能力。作为一名长期关注量子算法与信息安全交叉领域的研究者,我亲眼见证了量子机器学习从理论构想走向实际应用的飞速发…...

【Sora 2视频后期处理黄金法则】:20年AI影像专家亲授5大不可绕过的帧级调优技巧

更多请点击: https://codechina.net 第一章:Sora 2视频后期处理的底层逻辑与帧级思维重构 Sora 2并非传统时间轴驱动的剪辑工具,其视频后期处理建立在扩散模型与隐空间帧序列联合优化的基础之上。每一帧不再作为孤立图像存在,而是…...

Burp Suite实操避坑指南:从抓包失败到漏洞验证的完整链路

1. 这不是又一本“Burp Suite入门指南”,而是一份我亲手调试过37次配置、在真实客户环境里跑通21个靶场、被5个刚转行的安全新人追着问细节的实操手记你点开这个标题,大概率正站在两个路口之间:一边是满屏英文弹窗、Proxy拦截失败、Repeater发…...