该计划来源于豆包。仅可作为入门简易参考,教程内容不保证完全正确或者完整,若涉及代码会经过实际验证。
第一阶段:基础入门(第 1-7 天)—— 搞定 Dart 与 Flutter 环境※
第 1 天:环境搭建 + Dart 基础语法※
学习内容:
安装 Flutter SDK(Windows/macOS 按官方教程)
配置 Android Studio(安装 Flutter 插件、模拟器)
Dart 基础:变量(
var/int/String)、数据类型(List/Map)
实践任务:
成功运行 Flutter 自带的「计数器 Demo」
用 DartPad 写 3 个小例子:定义变量、创建 List/Map、打印数据
第 2 天:Dart 函数与控制流※
学习内容:
Dart 函数(普通函数、匿名函数、可选参数)
控制流(
if-else/for/while/switch)
实践任务:
写一个函数:计算两个数的和(支持可选参数,如默认加 0)
写一个循环:打印 1-10 的偶数,并用
switch判断数字是否为 5 的倍数
第 3 天:Dart 类与异步※
学习内容:
Dart 类(
class/构造函数/继承)异步编程(
Future/async/await,解决网络请求延迟问题)
实践任务:
定义一个「Person 类」,包含姓名、年龄,写一个方法打印个人信息
写一个异步函数:模拟 2 秒后返回 “请求成功”,并用
async-await调用
第 4 天:Flutter 核心概念 —— Widget※
学习内容:
Flutter 核心思想:“一切皆 Widget”
两种基础 Widget:
StatelessWidget(无状态,静态 UI)、StatefulWidget(有状态,动态 UI)
实践任务:
用
StatelessWidget写一个静态页面:显示 “我的第一个 Flutter 页面”+ 一张图片用
StatefulWidget改写计数器 Demo:点击按钮数字 + 1,标题显示当前数字
第 5 天:Flutter 基础布局(1)※
学习内容:
线性布局:
Row(水平排列)、Column(垂直排列)容器组件:
Container(控制宽高、背景色、边距)
实践任务:
用
Column做一个页面:顶部标题、中间图片、底部两个按钮(水平排列用Row)给容器加边距(
margin)、内边距(padding)、背景色
第 6 天:Flutter 基础布局(2)※
学习内容:
弹性布局:
Expanded(占满剩余空间)、Flex层叠布局:
Stack(组件叠放)、Positioned(固定位置)
实践任务:
用
Row+Expanded做一个 “底部导航栏”:3 个按钮,每个占 1/3 宽度用
Stack做一个 “图片水印”:背景图 + 右上角文字水印
第 7 天:常用基础 Widget(文本、图片、按钮)※
学习内容:
Text(字体大小、颜色、加粗)、Image(本地图片、网络图片)按钮:
ElevatedButton(带阴影)、TextButton(文字按钮)、点击事件(onPressed)
实践任务:
做一个 “个人名片” 页面:显示头像(网络图片)、姓名(加粗)、签名(灰色小字)
加一个按钮:点击后打印 “按钮被点击”,并弹出一个简单提示(用
print暂代)
第二阶段:业务 App 开发(第 8-18 天)—— 能做基础交互与跨端适配※
第 8 天:路由跳转(页面切换)※
学习内容:
基本路由:
Navigator.push(跳转到新页面)、Navigator.pop(返回上一页)带参数路由:跳转时传值(如从列表页传 ID 到详情页)
实践任务:
做两个页面:“首页” 和 “详情页”,首页按钮跳转到详情页
首页传 “商品名称” 到详情页,详情页显示该名称
第 9 天:列表组件(ListView)※
学习内容:
ListView基础:静态列表、动态列表(ListView.builder优化性能)列表项:
ListTile(自带图标、标题、副标题的组件)
实践任务:
用
ListView.builder做一个 “新闻列表”:循环显示 10 条新闻(标题 + 副标题)点击列表项跳转到详情页,传当前新闻标题
第 10 天:表单与输入(TextField)※
学习内容:
TextField(输入框,支持文本、密码类型)表单验证:判断输入是否为空、格式是否正确(如手机号)
实践任务:
做一个 “登录页面”:包含账号输入框、密码输入框(隐藏密码)、登录按钮
登录按钮点击时验证:账号 / 密码为空则提示 “请填写完整”
第 11 天:状态管理(Provider 基础)※
学习内容:
为什么需要状态管理:跨页面共享数据(如登录状态、用户信息)
Provider 核心:
ChangeNotifier(数据模型)、Provider(注入数据)、Consumer(消费数据)
实践任务:
用 Provider 管理 “用户登录状态”:登录后,首页显示 “欢迎 + 用户名”
退出登录时,清空用户信息并返回登录页
第 12 天:网络请求(Dio)※
学习内容:
安装 Dio 依赖(
pubspec.yaml配置)Dio 基础:
get请求(获取数据)、post请求(提交数据)
实践任务:
用 Dio 调用公开 API(如 “https://jsonplaceholder.typicode.com/posts”)
获取数据后,用
ListView显示接口返回的 “标题列表”
第 13 天:本地存储(SharedPreferences)※
学习内容:
安装 SharedPreferences 依赖
本地存储操作:存数据(
setString/setInt)、取数据(getString)、删数据(remove)
实践任务:
优化登录页:登录成功后,本地存储 “用户名”
App 启动时,读取本地存储:若有用户名则直接进入首页,否则进入登录页
第 14 天:加载状态与错误处理※
学习内容:
网络请求状态:加载中(
CircularProgressIndicator)、成功、失败错误处理:捕获 Dio 请求异常(如网络错误、接口报错)
实践任务:
改造新闻列表页:请求数据时显示 “加载中”,成功则显示列表,失败则显示 “请求失败,请重试”
加一个 “重试按钮”:失败时点击重新请求数据
第 15 天:跨端适配基础※
学习内容:
屏幕适配:
MediaQuery获取屏幕宽高,按比例设置组件大小平台判断:
Platform.isAndroid/Platform.isIOS(区分安卓 /iOS 样式)
实践任务:
做一个 “设置页面”:安卓显示 “返回键”,iOS 显示 “完成键”(用平台判断)
按钮宽高按屏幕比例设置(如宽度 = 屏幕宽 * 0.8)
第 16 天:Web 端适配※
学习内容:
Flutter Web 配置:
pubspec.yaml启用 Web 支持Web 特有问题:鼠标事件(替代触屏)、滚动条优化
实践任务:
将之前的 “登录页 + 首页” 运行到 Web 端(
flutter run -d chrome)适配 Web 端按钮:鼠标悬浮时改变颜色
第 17 天:桌面端适配(Windows/macOS)※
学习内容:
启用桌面端支持(
flutter config --enable-windows-desktop)桌面端特有:窗口大小设置、键盘快捷键
实践任务:
将项目运行到 Windows/macOS 桌面端(
flutter run -d windows)设置窗口默认大小(在
windows/runner/main.cpp中配置)
第 18 天:业务 App 整合(综合练习)※
目标:把前 10 天内容整合,做一个 “简易新闻 App”
功能清单:
登录页(本地存储记住账号)
新闻列表页(Dio 请求数据、加载状态、下拉刷新)
新闻详情页(接收列表页传值、显示内容)
实践任务:
完成 App 核心功能,确保 Android/iOS/Web/ 桌面端能正常运行
修复适配问题(如 Web 端列表滚动、桌面端窗口大小)
第三阶段:轻量游戏开发(第 19-28 天)—— 用 Flame 做 2D 游戏※
第 19 天:Flame 环境搭建与基础※
学习内容:
安装 Flame 依赖(
flame: ^1.14.0,按官网最新版本)Flame 核心:
GameWidget(游戏容器)、FlameGame(游戏基类)
实践任务:
创建第一个 Flame 项目:运行一个空白游戏页面,显示 “我的第一个 Flame 游戏”
理解游戏循环(
update刷新逻辑、render绘制画面)
第 20 天:Flame 精灵与图片加载※
学习内容:
精灵(
Sprite):加载单张图片作为游戏元素(如玩家、敌人)精灵组件(
SpriteComponent):将精灵添加到游戏场景
实践任务:
准备一张 “玩家图片”(如小方块、角色图标),放入
assets/images在游戏中加载图片,显示一个静止的玩家精灵(固定在屏幕中间)
第 21 天:游戏输入控制(触屏 / 键盘)※
学习内容:
触屏控制:
TapDetector(点击)、PanDetector(拖动)键盘控制:
KeyboardHandler(上下左右键移动)
实践任务:
实现 “拖动玩家”:触屏拖动时,玩家精灵跟随手指移动
桌面 / Web 端支持键盘:按方向键,玩家精灵向对应方向移动(速度可配置)
第 22 天:游戏动画(SpriteAnimation)※
学习内容:
精灵动画:
SpriteAnimation(多张图片循环播放,如走路动画)动画组件:
SpriteAnimationComponent
实践任务:
准备一组 “走路动画图片”(如 4 张不同姿势的图片)
实现玩家 “移动时播放动画,静止时显示默认帧”
第 23 天:碰撞检测※
学习内容:
碰撞形状:
RectangleHitbox(矩形碰撞)、CircleHitbox(圆形碰撞)碰撞检测:
collidesWith(判断两个组件是否碰撞)
实践任务:
给玩家添加矩形碰撞盒,再添加一个 “食物” 精灵(带碰撞盒)
实现 “吃食物”:玩家碰到食物时,食物消失,分数 + 1
第 24 天:游戏分数与 UI※
学习内容:
游戏 UI:
TextComponent(显示分数、生命值)UI 固定位置:用
PositionType.viewport让 UI 不跟随场景移动
实践任务:
在游戏顶部显示 “分数:X”,玩家吃食物时分数实时更新
加一个 “重新开始” 按钮:点击后重置分数和玩家位置
第 25 天:游戏边界与障碍物※
学习内容:
边界限制:让玩家不能移出屏幕
障碍物:添加固定组件(如墙壁),玩家碰到后不能穿过
实践任务:
限制玩家移动范围:不能超出屏幕上下左右边界
在屏幕中间添加一个 “墙壁” 精灵,玩家碰到墙壁后停止移动
第 26 天:游戏结束与重新开始※
学习内容:
游戏状态管理:定义 “游戏中”“游戏结束” 状态
游戏结束逻辑:如玩家碰到 “敌人” 后显示结束界面
实践任务:
添加 “敌人” 精灵(自动移动),玩家碰到敌人后触发游戏结束
游戏结束时显示 “游戏结束!分数:X” 和 “重新开始” 按钮
第 27 天:游戏音效※
学习内容:
安装 Flame 音效依赖(
flame_audio)音效播放:
FlameAudio.play(吃食物音效)、FlameAudio.loop(背景音乐)
实践任务:
准备 “吃食物音效”“游戏结束音效”“背景音乐”,放入
assets/audio实现:游戏开始播放背景音乐,吃食物播放音效,游戏结束停止音乐并播放结束音效
第 28 天:小游戏整合(综合练习)※
目标:完成一个 “贪吃蛇简化版” 小游戏
功能清单:
玩家(蛇头):可拖动 / 键盘控制移动
食物:随机生成,吃后分数 + 1、播放音效
敌人:自动移动,碰到后游戏结束
UI:分数显示、重新开始按钮、背景音乐
实践任务:
完成小游戏核心功能,确保多端(移动端 / 桌面 / Web)可玩
优化体验:如食物随机生成位置不重叠、敌人移动速度适中
第四阶段:项目整合与发布(第 29-30 天)—— 做一个 “App + 小游戏” 一体化项目※
第 29 天:App 与小游戏整合※
学习内容:
路由整合:在业务 App 中添加 “小游戏入口” 按钮,点击跳转到游戏页面
数据共享:如 App 中的用户信息传递到游戏(显示 “玩家:XXX”)
实践任务:
在之前的 “新闻 App” 首页加一个 “小游戏” 按钮,点击跳转到 Flame 游戏
游戏中显示当前登录用户的姓名(从 App 状态管理中获取)
第 30 天:打包发布与总结※
学习内容:
多端打包:Android(APK)、Web(静态文件)、Windows(exe)
发布准备:图标配置、版本号设置
实践任务:
给项目配置自定义图标(Android/iOS/ 桌面端)
打包 Android APK、Web 静态文件、Windows 可执行文件
总结 30 天学习内容,记录遇到的问题与解决方案