COURSE MAP
已开放课程
按顺序学习,也可以直接进入需要的主题。
先把应用跑起来
01--04Flutter 是什么:先看清它能共享什么
Flutter 的核心价值不是“所有平台完全写一次”,而是让界面、业务逻辑和数据层尽量共享,同时为平台能力保留清晰的适配出口。
开始阅读 LESSON 02三端支持边界:不是同一条轨道
iOS、Android 是 Flutter 官方支持的移动平台;HarmonyOS NEXT/OpenHarmony 需要 Flutter-OH 适配。正确方案是共享业务源码,但使用两条 SDK 与构建轨道。
开始阅读 LESSON 03搭建 macOS 与 iOS 开发环境
先把 Flutter、Xcode Command Line Tools 和 iOS Simulator 接通,再处理 Android 与鸿蒙。完成标准不是“软件装过了”,而是 flutter doctor 能识别工具链,flutter devices 能看到模拟器。
开始阅读 LESSON 04运行第一个 iOS 应用
这一篇只完成一个闭环:创建项目、选中 iOS Simulator、运行应用、修改一处文字并看到热重载结果。做到这一步,才算开发环境真正可用。
开始阅读补齐开发环境
05--09用 VS Code 运行、调试和热重载 Flutter 应用
VS Code 配好 Flutter 与 Dart 扩展后,可以完成设备选择、运行、断点调试、热重载和问题定位。本篇以 iOS 作为主操作平台;同一套 Flutter 运行与热重载链路也已在 Android 模拟器通过命令行实际验证,不引入新的项目依赖。
开始阅读 LESSON 06看懂 Android Studio、Android SDK、模拟器与构建流程差异
Android Studio 只是开发入口之一,不等于完整的 Android 工具链。Flutter 面向 Android 运行或构建时,还会依赖 Android SDK、JDK、Gradle、Android Gradle Plugin、设备或模拟器;这些组件与 iOS 的 Xcode、Simulator 和构建系统并不是逐项等价的替换关系。
开始阅读 LESSON 07认识 DevEco Studio、Flutter-OH 与大陆下载环境
Flutter-OH 不是 Flutter 官方 stable 增加的一个开关,而是 CPF-Flutter 基于特定 Flutter 上游版本维护的 OpenHarmony 适配 SDK。搭建环境时必须同时锁定 Flutter-OH tag、DevEco Studio、OpenHarmony API 和 Dart 版本,不能把第 03 课安装的上游 Flutter 直接拿来构建 HAP。
开始阅读 LESSON 08用绝对路径切换上游 Flutter 与 Flutter-OH
同一台 Mac 上可以并存上游 Flutter 与 Flutter-OH,但不要把两套 SDK 的 bin 同时永久加入 PATH。本课程采用“分别保存 SDK,执行命令时写明 SDK 绝对路径”的方式:iOS/Android 命令固定交给上游 Flutter,OpenHarmony 命令固定交给 Flutter-OH。
开始阅读 LESSON 09认识 Flutter 项目:共享源码、平台工程与生成文件
Flutter 项目不是只有 lib/main.dart,也不是四套彼此独立的应用。lib/ 保存共享 Dart 源码,ios/、android/ 和未来的 ohos/ 分别承担平台接入,项目根目录的 pubspec.yaml 则声明包、SDK 约束、资源和 Flutter 配置。
开始阅读只学够用的 Dart
10--15用 Dart 表达一条可靠的灵感数据
Dart 是类型安全的语言,但写局部变量时通常不需要重复标注显而易见的类型。会变化的状态用 var,初始化后不再重新赋值的变量用 final,编译时就确定且内容也不允许修改的值用 const。只有业务上确实允许“没有值”时,才把类型写成 String? 这样的可空类型。
开始阅读 LESSON 11用函数和类建立一条有效的灵感
函数负责完成边界明确的操作,类负责把属于同一个业务对象的数据和行为组织在一起。为 SparkIdea 设计构造函数时,标题使用 required 命名参数,说明允许省略,优先级和完成状态提供默认值;构造过程同时清洗和检查输入,避免创建标题无效的灵感对象。
开始阅读 LESSON 12用集合和模式匹配整理多条灵感
把多条灵感放进 List,用 where 筛选、用 map 转换,再把需要排序的数据复制成列表。标签用 Set 去重,按标识查找用 Map。结构化输入先通过模式匹配检查字段类型,再交给 SparkIdea 构造函数检查业务规则。
开始阅读 LESSON 13等待灵感加载,并正确处理异步失败
Future<T> 表示一次异步操作将来的结果,成功时得到 T,失败时得到错误。async 函数返回 Future,await 等待它完成;把 await 放进 try,才能在这一层处理异步错误。空列表是成功结果,加载失败应保留失败语义,不能统一变成空列表。
开始阅读 LESSON 14用 Stream 接收变化,并在需要时停止
一次加载需要一个结果,用 Future;同一次订阅需要陆续接收变化,才考虑 Stream。本篇用 async 生成三次灵感列表快照,用 await for 依次处理,并明确正常结束、发生错误和主动停止的差别。
开始阅读 LESSON 15用测试验证 Dart 业务逻辑
把业务规则写成明确的输入和预期结果,再交给测试工具自动比较。同步结果用 expect,同步异常把调用包进函数,Future 和 Stream 用 await expectLater 等待匹配完成。测试要能在行为错误时失败,不能只运行代码或打印“通过”。
开始阅读理解 Flutter UI
16--17点击之后,Widget、Element 和 RenderObject 各做什么
Widget 描述界面配置,Element 管理这些配置在界面树中的位置与更新,RenderObject 负责布局、绘制等渲染工作。点击计数按钮时,新的 Text 配置可以更新原有 Element,并继续使用原来的 RenderParagraph;重建 Widget 不等于把界面的所有对象推倒重来。
开始阅读 LESSON 17先看约束,再解决尺寸和溢出
子组件只能在父级给出的约束内选择尺寸,写了 width: 120 不代表最终一定宽 120。Row 中的普通文本也不会自动得到“剩余宽度”;长标题需要先通过 Expanded 等方式取得有限宽度,再决定换行或截断。
开始阅读