news 2026/7/7 18:51:13

Flutter + FastAPI 30天速成计划自用并实践-第10天-组件化开发实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flutter + FastAPI 30天速成计划自用并实践-第10天-组件化开发实践

Day 10 详细学习计划:组件化开发实践

内容有点多,有点吃不消,看了好多视频和文章才开始做这样天的内容,做出来是这个效果

学习目标

  • 理解 StatelessWidget 和 StatefulWidget
  • 学习组件化开发思想
  • 创建可复用的文章卡片组件
  • 实现组件间通信

知识点详解

1. StatelessWidget vs StatefulWidget

StatelessWidget:

  • 不可变的 Widget
  • 一旦创建就不能改变
  • 适用于静态内容

StatefulWidget:

  • 可变的 Widget
  • 有状态管理能力
  • 适用于交互式内容

2. 组件化开发思想

核心理念:

  • 单一职责原则:每个组件只负责一项功能
  • 可复用性:组件可以在多处使用
  • 可组合性:通过组合小组件构建复杂界面

优势:

  • 提高开发效率
  • 便于维护和调试
  • 促进团队协作

3. 组件生命周期

StatelessWidget 生命周期:

  1. 构造函数调用
  2. build 方法执行

StatefulWidget 生命周期:

  1. createState 方法
  2. initState 方法(初始化状态)
  3. build 方法(构建界面)
  4. setState 方法(更新状态)
  5. dispose 方法(销毁资源)

练习代码

1. 文章卡片组件 ArticleCard

创建 components/article_card.dart
import'package:flutter/material.dart';classArticleCardextendsStatelessWidget{finalString title;finalString summary;finalString?author;finalbool isPublished;finalVoidCallback onTap;constArticleCard({Key?key,requiredthis.title,requiredthis.summary,this.author,this.isPublished=false,requiredthis.onTap,}):super(key:key);@overrideWidgetbuild(BuildContext context){returnCard(elevation:4,margin:constEdgeInsets.all(8),child:InkWell(onTap:onTap,child:Padding(padding:constEdgeInsets.all(16),child:Column(crossAxisAlignment:CrossAxisAlignment.start,children:[Row(children:[Expanded(child:Text(title,style:constTextStyle(fontSize:18,fontWeight:FontWeight.bold,),),),if(!isPublished)constChip(label:Text('草稿'),backgroundColor:Colors.orange,),],),constSizedBox(height:8),Text(summary,style:constTextStyle(fontSize:14,color:Colors.grey,),maxLines:3,overflow:TextOverflow.ellipsis,),constSizedBox(height:8),if(author!=null)Text('作者: $author',style:constTextStyle(fontSize:12,color:Colors.blue,),),],),),),);}}

2. 可展开的文章卡片 ExpandableArticleCard

创建 components/expandable_article_card.dart
import'package:flutter/material.dart';classExpandableArticleCardextendsStatefulWidget{finalString title;finalString content;finalString?author;constExpandableArticleCard({Key?key,requiredthis.title,requiredthis.content,this.author,}):super(key:key);@overrideState<ExpandableArticleCard>createState()=>_ExpandableArticleCardState();}class_ExpandableArticleCardStateextendsState<ExpandableArticleCard>{bool _isExpanded=false;@overrideWidgetbuild(BuildContext context){returnCard(elevation:4,margin:constEdgeInsets.all(8),child:Column(crossAxisAlignment:CrossAxisAlignment.start,children:[ListTile(title:Text(widget.title,style:constTextStyle(fontWeight:FontWeight.bold),),subtitle:widget.author!=null?Text('作者: ${widget.author}'):null,trailing:IconButton(icon:Icon(_isExpanded?Icons.expand_less:Icons.expand_more,),onPressed:(){setState((){_isExpanded=!_isExpanded;});},),),if(_isExpanded)Padding(padding:constEdgeInsets.symmetric(horizontal:16,vertical:8),child:Text(widget.content),),],),);}}

3. 使用自定义组件

更新 lib/main.dart
import'package:flutter/material.dart';import'components/article_card.dart';import'components/expandable_article_card.dart';voidmain(){runApp(constMyApp());}classMyAppextendsStatelessWidget{constMyApp({Key?key}):super(key:key);@overrideWidgetbuild(BuildContext context){returnMaterialApp(title:'Tutorial Site',theme:ThemeData(primarySwatch:Colors.blue,),home:constTutorialHomePage(),);}}classTutorialHomePageextendsStatelessWidget{constTutorialHomePage({Key?key}):super(key:key);@overrideWidgetbuild(BuildContext context){// 模拟文章数据finalarticles=[{'title':'Day 1: 环境搭建','summary':'学习如何安装 Python、FastAPI 和配置开发环境','author':'教程作者','published':true,},{'title':'Day 2: 数据模型','summary':'学习 Pydantic 和数据验证','author':'教程作者','published':true,},{'title':'Day 3: 数据库集成','summary':'学习 SQLite 和 SQLModel 的使用','author':'教程作者','published':false,},];returnScaffold(appBar:AppBar(title:constText('Flutter + FastAPI 教程网站'),),body:Row(children:[// 左侧导航栏Expanded(flex:1,child:Container(color:Colors.grey[300],child:ListView(children:[ListTile(leading:constIcon(Icons.book),title:constText('环境搭建'),onTap:(){// TODO: 导航到环境搭建教程},),ListTile(leading:constIcon(Icons.data_object),title:constText('数据模型'),onTap:(){// TODO: 导航到数据模型教程},),ListTile(leading:constIcon(Icons.storage),title:constText('数据库集成'),onTap:(){// TODO: 导航到数据库集成教程},),ListTile(leading:constIcon(Icons.api),title:constText('CRUD 操作'),onTap:(){// TODO: 导航到 CRUD 操作教程},),],),),),// 右侧内容区域Expanded(flex:3,child:Container(padding:constEdgeInsets.all(16.0),child:Column(crossAxisAlignment:CrossAxisAlignment.start,children:[constText('最新教程',style:TextStyle(fontSize:24,fontWeight:FontWeight.bold,),),constSizedBox(height:16),Expanded(child:ListView.builder(itemCount:articles.length,itemBuilder:(context,index){finalarticle=articles[index];returnArticleCard(title:article['title']!,summary:article['summary']!,author:article['author'],isPublished:article['published']asbool,onTap:(){// 点击文章卡片的处理ScaffoldMessenger.of(context).showSnackBar(SnackBar(content:Text('打开文章: ${article['title']}'),),);},);},),),constSizedBox(height:32),constText('可展开卡片示例',style:TextStyle(fontSize:20,fontWeight:FontWeight.bold,),),constSizedBox(height:16),constExpandableArticleCard(title:'什么是 Flutter?',content:'Flutter 是 Google 开源的 UI 工具包,用于从单一代码库为移动、Web 和桌面构建美观的原生编译应用程序。',author:'Google',),constSizedBox(height:16),constExpandableArticleCard(title:'什么是 FastAPI?',content:'FastAPI 是一个现代、快速(高性能)的 Python Web 框架,用于构建 API,基于标准的 Python 类型提示。',author:'Sebastián Ramírez',),],),),),],),);}}

4. 创建组件目录结构

lib/ ├── main.dart ├── components/ │ ├── article_card.dart │ └── expandable_article_card.dart
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 18:54:44

百度网盘提取码自动获取神器:告别手动搜索的3步智能解决方案

百度网盘提取码自动获取神器&#xff1a;告别手动搜索的3步智能解决方案 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘的提取码而烦恼吗&#xff1f;每次从论坛、社群获取资源链接后&#xff0c;都要费时费力…

作者头像 李华
网站建设 2026/7/7 14:38:46

20亿参数挑战千亿模型:土耳其语专用LLM Kumru-2B改写行业规则

在全球大语言模型竞赛白热化的今天&#xff0c;土耳其人工智能领军企业VNGRS推出的开源模型Kumru-2B正引发行业变革。这款定位为土耳其语场景深度优化的轻量级AI系统&#xff0c;以仅20亿参数的体量&#xff0c;在权威评测中屡次击败参数量数十倍于己的超级模型&#xff0c;不仅…

作者头像 李华
网站建设 2026/7/7 3:32:05

Qwen3-30B-A3B-Thinking-2507-FP8:新一代推理增强大模型重磅发布

Qwen3-30B-A3B-Thinking-2507-FP8&#xff1a;新一代推理增强大模型重磅发布 【免费下载链接】Qwen3-30B-A3B-Thinking-2507-FP8 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3-30B-A3B-Thinking-2507-FP8 在人工智能领域的快速迭代浪潮中&#xff0c;推理能…

作者头像 李华
网站建设 2026/7/7 18:49:55

国外好软件,但切勿非法使用,否则后果自负!

软件介绍 今天推荐的这款软件叫&#xff1a;后台录像机&#xff0c;是一款国外的软件&#xff0c;软件本身没有汉化&#xff0c;所以还是英文版&#xff0c;但是一点也不难&#xff0c;功能超级的简单。 软件安装以后是两个图标&#xff0c;按红色的那个“视频拍摄”是没有软件…

作者头像 李华
网站建设 2026/7/7 10:21:00

文本指令驱动视频创作革命:Lucy Edit AI开源模型重塑内容生产范式

在数字内容创作领域&#xff0c;视频编辑长期被专业软件的复杂操作和陡峭学习曲线所桎梏。DecartAI团队推出的Lucy Edit AI开源模型&#xff0c;正以颠覆性技术路径打破这一僵局——这款基于文本指令的视频编辑基础模型&#xff0c;首次实现了通过自然语言描述完成专业级视频修…

作者头像 李华
网站建设 2026/7/7 7:57:31

终极游戏控制器虚拟化:3步解决跨平台兼容难题

终极游戏控制器虚拟化&#xff1a;3步解决跨平台兼容难题 【免费下载链接】ViGEmBus 项目地址: https://gitcode.com/gh_mirrors/vig/ViGEmBus 游戏控制器虚拟化技术是现代游戏体验的关键突破&#xff0c;它能彻底解决不同平台、不同设备间的兼容性问题。无论是想在PC上…

作者头像 李华