Flutter零基础30天学习计划

-
-
2025-09-29 17:31
该计划来源于豆包。仅可作为入门简易参考,教程内容不保证完全正确或者完整,若涉及代码会经过实际验证。
本计划每天学习 + 实践时间建议 1.5-2 小时,优先掌握「能落地的核心技能」,避免陷入理论陷阱,最终能独立开发简单跨端业务 App 和轻量 2D 游戏。

第一阶段:基础入门(第 1-7 天)—— 搞定 Dart 与 Flutter 环境

第 1 天:环境搭建 + Dart 基础语法

  • 学习内容

    1. 安装 Flutter SDK(Windows/macOS 按官方教程)

    2. 配置 Android Studio(安装 Flutter 插件、模拟器)

    3. Dart 基础:变量(var/int/String)、数据类型(List/Map)

  • 实践任务

    1. 成功运行 Flutter 自带的「计数器 Demo」

    2. 用 DartPad 写 3 个小例子:定义变量、创建 List/Map、打印数据

第 2 天:Dart 函数与控制流

  • 学习内容

    1. Dart 函数(普通函数、匿名函数、可选参数)

    2. 控制流(if-else/for/while/switch

  • 实践任务

    1. 写一个函数:计算两个数的和(支持可选参数,如默认加 0)

    2. 写一个循环:打印 1-10 的偶数,并用 switch 判断数字是否为 5 的倍数

第 3 天:Dart 类与异步

  • 学习内容

    1. Dart 类(class/构造函数/继承

    2. 异步编程(Future/async/await,解决网络请求延迟问题)

  • 实践任务

    1. 定义一个「Person 类」,包含姓名、年龄,写一个方法打印个人信息

    2. 写一个异步函数:模拟 2 秒后返回 “请求成功”,并用 async-await 调用

第 4 天:Flutter 核心概念 —— Widget

  • 学习内容

    1. Flutter 核心思想:“一切皆 Widget”

    2. 两种基础 Widget:StatelessWidget(无状态,静态 UI)、StatefulWidget(有状态,动态 UI)

  • 实践任务

    1. StatelessWidget 写一个静态页面:显示 “我的第一个 Flutter 页面”+ 一张图片

    2. StatefulWidget 改写计数器 Demo:点击按钮数字 + 1,标题显示当前数字

第 5 天:Flutter 基础布局(1)

  • 学习内容

    1. 线性布局:Row(水平排列)、Column(垂直排列)

    2. 容器组件:Container(控制宽高、背景色、边距)

  • 实践任务

    1. Column 做一个页面:顶部标题、中间图片、底部两个按钮(水平排列用 Row

    2. 给容器加边距(margin)、内边距(padding)、背景色

第 6 天:Flutter 基础布局(2)

  • 学习内容

    1. 弹性布局:Expanded(占满剩余空间)、Flex

    2. 层叠布局:Stack(组件叠放)、Positioned(固定位置)

  • 实践任务

    1. Row+Expanded 做一个 “底部导航栏”:3 个按钮,每个占 1/3 宽度

    2. Stack 做一个 “图片水印”:背景图 + 右上角文字水印

第 7 天:常用基础 Widget(文本、图片、按钮)

  • 学习内容

    1. Text(字体大小、颜色、加粗)、Image(本地图片、网络图片)

    2. 按钮:ElevatedButton(带阴影)、TextButton(文字按钮)、点击事件(onPressed

  • 实践任务

    1. 做一个 “个人名片” 页面:显示头像(网络图片)、姓名(加粗)、签名(灰色小字)

    2. 加一个按钮:点击后打印 “按钮被点击”,并弹出一个简单提示(用 print 暂代)

第二阶段:业务 App 开发(第 8-18 天)—— 能做基础交互与跨端适配

第 8 天:路由跳转(页面切换)

  • 学习内容

    1. 基本路由:Navigator.push(跳转到新页面)、Navigator.pop(返回上一页)

    2. 带参数路由:跳转时传值(如从列表页传 ID 到详情页)

  • 实践任务

    1. 做两个页面:“首页” 和 “详情页”,首页按钮跳转到详情页

    2. 首页传 “商品名称” 到详情页,详情页显示该名称

第 9 天:列表组件(ListView)

  • 学习内容

    1. ListView 基础:静态列表、动态列表(ListView.builder 优化性能)

    2. 列表项:ListTile(自带图标、标题、副标题的组件)

  • 实践任务

    1. ListView.builder 做一个 “新闻列表”:循环显示 10 条新闻(标题 + 副标题)

    2. 点击列表项跳转到详情页,传当前新闻标题

第 10 天:表单与输入(TextField)

  • 学习内容

    1. TextField(输入框,支持文本、密码类型)

    2. 表单验证:判断输入是否为空、格式是否正确(如手机号)

  • 实践任务

    1. 做一个 “登录页面”:包含账号输入框、密码输入框(隐藏密码)、登录按钮

    2. 登录按钮点击时验证:账号 / 密码为空则提示 “请填写完整”

第 11 天:状态管理(Provider 基础)

  • 学习内容

    1. 为什么需要状态管理:跨页面共享数据(如登录状态、用户信息)

    2. Provider 核心:ChangeNotifier(数据模型)、Provider(注入数据)、Consumer(消费数据)

  • 实践任务

    1. 用 Provider 管理 “用户登录状态”:登录后,首页显示 “欢迎 + 用户名”

    2. 退出登录时,清空用户信息并返回登录页

第 12 天:网络请求(Dio)

  • 学习内容

    1. 安装 Dio 依赖(pubspec.yaml 配置)

    2. Dio 基础:get 请求(获取数据)、post 请求(提交数据)

  • 实践任务

    1. 用 Dio 调用公开 API(如 “https://jsonplaceholder.typicode.com/posts”)

    2. 获取数据后,用 ListView 显示接口返回的 “标题列表”

第 13 天:本地存储(SharedPreferences)

  • 学习内容

    1. 安装 SharedPreferences 依赖

    2. 本地存储操作:存数据(setString/setInt)、取数据(getString)、删数据(remove

  • 实践任务

    1. 优化登录页:登录成功后,本地存储 “用户名”

    2. App 启动时,读取本地存储:若有用户名则直接进入首页,否则进入登录页

第 14 天:加载状态与错误处理

  • 学习内容

    1. 网络请求状态:加载中(CircularProgressIndicator)、成功、失败

    2. 错误处理:捕获 Dio 请求异常(如网络错误、接口报错)

  • 实践任务

    1. 改造新闻列表页:请求数据时显示 “加载中”,成功则显示列表,失败则显示 “请求失败,请重试”

    2. 加一个 “重试按钮”:失败时点击重新请求数据

第 15 天:跨端适配基础

  • 学习内容

    1. 屏幕适配:MediaQuery 获取屏幕宽高,按比例设置组件大小

    2. 平台判断:Platform.isAndroid/Platform.isIOS(区分安卓 /iOS 样式)

  • 实践任务

    1. 做一个 “设置页面”:安卓显示 “返回键”,iOS 显示 “完成键”(用平台判断)

    2. 按钮宽高按屏幕比例设置(如宽度 = 屏幕宽 * 0.8)

第 16 天:Web 端适配

  • 学习内容

    1. Flutter Web 配置:pubspec.yaml 启用 Web 支持

    2. Web 特有问题:鼠标事件(替代触屏)、滚动条优化

  • 实践任务

    1. 将之前的 “登录页 + 首页” 运行到 Web 端(flutter run -d chrome

    2. 适配 Web 端按钮:鼠标悬浮时改变颜色

第 17 天:桌面端适配(Windows/macOS)

  • 学习内容

    1. 启用桌面端支持(flutter config --enable-windows-desktop

    2. 桌面端特有:窗口大小设置、键盘快捷键

  • 实践任务

    1. 将项目运行到 Windows/macOS 桌面端(flutter run -d windows

    2. 设置窗口默认大小(在 windows/runner/main.cpp 中配置)

第 18 天:业务 App 整合(综合练习)

  • 目标:把前 10 天内容整合,做一个 “简易新闻 App”

  • 功能清单

    1. 登录页(本地存储记住账号)

    2. 新闻列表页(Dio 请求数据、加载状态、下拉刷新)

    3. 新闻详情页(接收列表页传值、显示内容)

  • 实践任务

    1. 完成 App 核心功能,确保 Android/iOS/Web/ 桌面端能正常运行

    2. 修复适配问题(如 Web 端列表滚动、桌面端窗口大小)

第三阶段:轻量游戏开发(第 19-28 天)—— 用 Flame 做 2D 游戏

第 19 天:Flame 环境搭建与基础

  • 学习内容

    1. 安装 Flame 依赖(flame: ^1.14.0,按官网最新版本)

    2. Flame 核心:GameWidget(游戏容器)、FlameGame(游戏基类)

  • 实践任务

    1. 创建第一个 Flame 项目:运行一个空白游戏页面,显示 “我的第一个 Flame 游戏”

    2. 理解游戏循环(update 刷新逻辑、render 绘制画面)

第 20 天:Flame 精灵与图片加载

  • 学习内容

    1. 精灵(Sprite):加载单张图片作为游戏元素(如玩家、敌人)

    2. 精灵组件(SpriteComponent):将精灵添加到游戏场景

  • 实践任务

    1. 准备一张 “玩家图片”(如小方块、角色图标),放入 assets/images

    2. 在游戏中加载图片,显示一个静止的玩家精灵(固定在屏幕中间)

第 21 天:游戏输入控制(触屏 / 键盘)

  • 学习内容

    1. 触屏控制:TapDetector(点击)、PanDetector(拖动)

    2. 键盘控制:KeyboardHandler(上下左右键移动)

  • 实践任务

    1. 实现 “拖动玩家”:触屏拖动时,玩家精灵跟随手指移动

    2. 桌面 / Web 端支持键盘:按方向键,玩家精灵向对应方向移动(速度可配置)

第 22 天:游戏动画(SpriteAnimation)

  • 学习内容

    1. 精灵动画:SpriteAnimation(多张图片循环播放,如走路动画)

    2. 动画组件:SpriteAnimationComponent

  • 实践任务

    1. 准备一组 “走路动画图片”(如 4 张不同姿势的图片)

    2. 实现玩家 “移动时播放动画,静止时显示默认帧”

第 23 天:碰撞检测

  • 学习内容

    1. 碰撞形状:RectangleHitbox(矩形碰撞)、CircleHitbox(圆形碰撞)

    2. 碰撞检测:collidesWith(判断两个组件是否碰撞)

  • 实践任务

    1. 给玩家添加矩形碰撞盒,再添加一个 “食物” 精灵(带碰撞盒)

    2. 实现 “吃食物”:玩家碰到食物时,食物消失,分数 + 1

第 24 天:游戏分数与 UI

  • 学习内容

    1. 游戏 UI:TextComponent(显示分数、生命值)

    2. UI 固定位置:用 PositionType.viewport 让 UI 不跟随场景移动

  • 实践任务

    1. 在游戏顶部显示 “分数:X”,玩家吃食物时分数实时更新

    2. 加一个 “重新开始” 按钮:点击后重置分数和玩家位置

第 25 天:游戏边界与障碍物

  • 学习内容

    1. 边界限制:让玩家不能移出屏幕

    2. 障碍物:添加固定组件(如墙壁),玩家碰到后不能穿过

  • 实践任务

    1. 限制玩家移动范围:不能超出屏幕上下左右边界

    2. 在屏幕中间添加一个 “墙壁” 精灵,玩家碰到墙壁后停止移动

第 26 天:游戏结束与重新开始

  • 学习内容

    1. 游戏状态管理:定义 “游戏中”“游戏结束” 状态

    2. 游戏结束逻辑:如玩家碰到 “敌人” 后显示结束界面

  • 实践任务

    1. 添加 “敌人” 精灵(自动移动),玩家碰到敌人后触发游戏结束

    2. 游戏结束时显示 “游戏结束!分数:X” 和 “重新开始” 按钮

第 27 天:游戏音效

  • 学习内容

    1. 安装 Flame 音效依赖(flame_audio

    2. 音效播放:FlameAudio.play(吃食物音效)、FlameAudio.loop(背景音乐)

  • 实践任务

    1. 准备 “吃食物音效”“游戏结束音效”“背景音乐”,放入 assets/audio

    2. 实现:游戏开始播放背景音乐,吃食物播放音效,游戏结束停止音乐并播放结束音效

第 28 天:小游戏整合(综合练习)

  • 目标:完成一个 “贪吃蛇简化版” 小游戏

  • 功能清单

    1. 玩家(蛇头):可拖动 / 键盘控制移动

    2. 食物:随机生成,吃后分数 + 1、播放音效

    3. 敌人:自动移动,碰到后游戏结束

    4. UI:分数显示、重新开始按钮、背景音乐

  • 实践任务

    1. 完成小游戏核心功能,确保多端(移动端 / 桌面 / Web)可玩

    2. 优化体验:如食物随机生成位置不重叠、敌人移动速度适中

第四阶段:项目整合与发布(第 29-30 天)—— 做一个 “App + 小游戏” 一体化项目

第 29 天:App 与小游戏整合

  • 学习内容

    1. 路由整合:在业务 App 中添加 “小游戏入口” 按钮,点击跳转到游戏页面

    2. 数据共享:如 App 中的用户信息传递到游戏(显示 “玩家:XXX”)

  • 实践任务

    1. 在之前的 “新闻 App” 首页加一个 “小游戏” 按钮,点击跳转到 Flame 游戏

    2. 游戏中显示当前登录用户的姓名(从 App 状态管理中获取)

第 30 天:打包发布与总结

  • 学习内容

    1. 多端打包:Android(APK)、Web(静态文件)、Windows(exe)

    2. 发布准备:图标配置、版本号设置

  • 实践任务

    1. 给项目配置自定义图标(Android/iOS/ 桌面端)

    2. 打包 Android APK、Web 静态文件、Windows 可执行文件

    3. 总结 30 天学习内容,记录遇到的问题与解决方案


目录