跳到正文ChatGPT 说 · Jimmy Huang's BlogChatGPT 说
本页目录· 31 条
1. 本周 Seminar 总览
这周 Seminar 分成两大块。第一块是 Kotlin Basics:类、属性、函数、构造函数、继承、空安全、lambda、list。老师的意思不是要你一节课精通 Kotlin,而是先抓住那些“后面 Android 开发一直会碰到”的基本规则,尤其是 怎么写更安全、更少副作用的代码。
第二块是 Jetpack Compose Part I:什么是 Compose、什么是 @Composable、为什么要写 @Preview、怎么用 Column / Row / Box 摆界面、Modifier 是干什么的、Compose 的三阶段(composition / layout / drawing)是什么,以及 Button、TextField、Scaffold、Surface 这些后面做 UI 会常用的组件。老师明确说,Compose 是这门课做 Android UI 的指定方式,lab 和 assignment 都会用。
用学生更容易理解的话说:这周其实是在回答两个问题。第一,“Kotlin 代码到底该怎么写,才不容易出错?” 第二,“Android 界面在 Compose 里到底是怎么被拼出来、摆出来、显示出来的?”
2. 核心知识点总结
知识点 1:Kotlin 在这门课里是什么角色
这部分在讲什么: Kotlin 是这门课 Android 开发的主要语言。课件强调它是现代、简洁、安全、支持类型推断,而且 Google 推荐它做 Android 开发。老师口头还补充了:Kotlin 不只是给 Android 用,也可以跑 JVM、做跨平台。
为什么重要: 因为后面的 Compose、按钮点击、输入框变化、UI 组合,本质上都还是 Kotlin 代码。你 Kotlin 看不懂,Compose 就会越学越乱。
和课程整体有什么关系: Kotlin 是“语言层”,Compose 是“UI 层”。这周先把语言基础搭好,后面才接得住 Android 界面开发。
怎么理解: 可以把 Kotlin 看成“造房子的工具箱”,Compose 是“用这个工具箱搭房间和家具”。
知识点 2:属性、var / val、类型推断、初始化
这部分在讲什么: Kotlin 里的属性可以用 var 或 val 声明。var 是可变的,val 是只读的;类型可以显式写出来,也可以让编译器自动推断。类里的属性通常需要初始化;如果要后面再赋值,可以用
lateinit
,但它有限制:只能给
var
、不能给 primitive、而且必须是非空类型。
为什么重要: 这是 Kotlin 最基本、也是最容易被考的区别。老师明确说 var 和 val 的区别很重要,很可能出现在 quiz,而且默认更推荐用 val,因为更安全。
和课程整体有什么关系: 后面你定义 UI 状态、数据对象、输入值、列表数据时,都会不断决定:这里该用 val 还是 var。这直接影响代码是否稳定。
var 像“可以改绑的标签”,后面还能指向别的值。
老师特别强调:默认先想 val,真的需要变再用 var。
知识点 3:Null Safety(空安全)
这部分在讲什么: Kotlin 默认变量是 非空 的;如果一个变量可能为空,要写成 String? 这种可空类型。之后处理它时,你可以显式 if 判断,可以用安全调用 ?.,也可以用 !! 强行断言非空。课件还给了典型例子:message?.length 和 message!!.length。
为什么重要: 因为这就是 Kotlin 说自己“更安全”的核心之一。老师花了不少时间解释:安全调用是为了 避免 NullPointerException,而 !! 是危险写法,值一旦真的是 null,就会直接抛异常。
和课程整体有什么关系: Android 里很多数据都可能暂时没有值,比如用户输入、网络结果、界面状态,所以空安全几乎是天天都用。
前两个是稳妥写法,最后一个像“硬冲”,能不用就少用。
知识点 4:函数和类分别什么时候用
这部分在讲什么: 课件讲了类和函数的语法,但老师口头补充了更重要的一层:函数更适合做无状态、纯逻辑、工具型工作;类更适合表示有状态、要被保存、要在应用中持续存在的实体。 她还解释了 pure function:只吃输入、不依赖外部状态、尽量没有副作用。
为什么重要: 这不是单纯语法题,而是程序设计思路。老师明显想让大家开始有“建模意识”——不是所有东西都要写成 class。
和课程整体有什么关系: 做 app 设计时,你会不断决定:哪些是“用户、订单、记录”这种数据实体,哪些是“转换、格式化、计算”这种行为逻辑。这会影响你 assignment 的代码结构。
如果你要保存状态,用类;如果你只是处理输入输出,用函数。
知识点 5:构造函数和继承
这部分在讲什么: Kotlin 可以在类头直接写主构造函数;如果想让构造参数变成类里可访问的属性,要加 val 或 var。类默认是 final,如果想被继承,要加 open;子类继承时要用冒号并调用父类构造函数。
为什么重要: 因为这是 Kotlin 类结构最基本的读法。老师还专门带着大家辨认:哪一部分是 constructor、哪一部分是 body、哪些参数在类里能不能直接用。
和课程整体有什么关系: 你后面看 Android 代码,比如 MainActivity : ComponentActivity(),本质就是这里的继承语法。
怎么理解: 构造函数就是“创建这个对象时必须填的入场信息”;加上 val/var,这些信息才会真正变成“这个对象自己带着的数据”。
知识点 6:Lambda、高阶函数、it、trailing lambda
这部分在讲什么: Lambda 就是“没有名字的函数”。它用 { 参数 -> 行为 } 的形式写;左边是输入,右边是做什么。Lambda 也有类型,比如 (Int) -> Int。高阶函数就是“函数把另一个函数当参数传进去”。当 lambda 是最后一个参数时,可以移到括号外;如果只有一个参数,常常可以用 it 代替参数名。
为什么重要: 老师明确说,今天如果你最后只记住一个东西,那就是 lambda;她还说这部分“不容易”,但后面 Compose 里会“几乎一直用到”。这已经是非常强烈的重点信号了。
和课程整体有什么关系: Compose 的 Button 点击、TextField 输入变化、很多事件处理,本质上都是把“行为”作为 lambda 传给组件。不会 lambda,后面看 Compose API 会很吃力。
怎么理解: Lambda 就像一张“临时指令便签”——你不需要给它正式起名,只需要把“发生某事时要做什么”交过去。
onClick = { ... } = 点按钮时做这件事;
onValueChange = { name = it } = 输入框内容变了,就把新值更新进去。
知识点 7:List 与可变/不可变集合
这部分在讲什么: Kotlin 里的 List<T> 用来按顺序存东西。listOf() 生成不可变列表,mutableListOf() 生成可变列表。课件还特别提到:即使列表内容可变,也常常把引用本身声明成 val,这样更安全。
为什么重要: 因为 UI 往往是“拿一组数据渲染一串界面”。老师还直接说了,list 在 assignment 里会用到,尤其后面像 LazyColumn 这种列表 UI。
和课程整体有什么关系: 后面你做下拉菜单、动态项目列表、表单项集合,都会遇到“这组数据到底会不会变”。
怎么理解: 固定选项用不可变 list;会增加/删除内容的数据用 mutable list。老师给的口头例子是:固定下拉值适合 immutable,动态标题/名字集合适合 mutable。
知识点 8:Jetpack Compose 与 @Composable / @Preview
这部分在讲什么: Compose 是 Android 推荐的声明式 UI 工具包。@Composable 表示“这是一个用来产出 UI 的函数”,它接收数据,然后发出 UI 元素。@Preview 则是专门给你做界面预览和调试的。
为什么重要: 老师明确说,这门课里做 Android UI 就用 Compose,而且 Preview 很重要,因为它能让你不用每次都完整 build 和跑模拟器,就先看界面效果。
和课程整体有什么关系: 这直接连接 lab 和 assignment。你后面写的每个 screen,本质都是 composable functions。
怎么理解: @Composable 是“这不是普通函数,这是画界面的函数”;@Preview 是“先看图,再决定要不要正式运行”。
知识点 9:布局(Column / Row / Box)与 UI Tree
这部分在讲什么: Compose 里最基础的布局是 Column、Row、Box。Column 垂直排,Row 水平排,Box 更像一个容器/画布,可以让内容对齐、叠放、占满空间。布局还能嵌套。老师还把它和网页里的 DOM tree 类比:UI 组件是树状结构。
为什么重要: 这是你“把东西摆到屏幕上”的基本功。不先会布局,后面组件再多也拼不出来。
和课程整体有什么关系: Assignment 做的是 app screen skeleton prototype,本质上就是把各类组件按结构摆出来。
老师举的例子很直观:一个 icon 要放在两行文字左边,就用 Row 包住 icon 和 column。
知识点 10:Compose 的三阶段与 recomposition
这部分在讲什么: Compose 的 UI 形成过程有三阶段:composition、layout、drawing。先决定“有哪些 UI 元素”,再决定“它们放在哪”,最后真正“画到屏幕上”。老师还补充了 recomposition:当数据状态变化时,不是整页重来,而是受影响的部分重新走这些过程。
为什么重要: 老师直接说这部分“很重要,可能 quiz 会考”。这不是让你背概念而已,而是让你明白:为什么 Compose 能靠状态变化更新界面。
和课程整体有什么关系: 后面做交互、状态更新、输入框和按钮联动时,你必须知道 UI 不是“自己神奇变的”,而是 Compose 根据状态变化重新组合。
composition = 列出房间里有哪些家具;
recomposition = 家具换了,只重摆受影响那一块,不是整栋楼拆了重建。
知识点 11:Modifier、Surface、Scaffold、Button、TextField、Toast
这部分在讲什么: Modifier 用来给 UI 元素加样式、位置和行为;而且 顺序会影响结果。Surface 用来包住元素并加背景/边框/阴影;Scaffold 是整页结构骨架,常见于 top bar / bottom bar 这类页面框架;Button 和 TextField 是常用交互组件;Toast 是显示短消息的方式。
为什么重要: 因为这是“真正把页面做出来”的工具。老师还特别强调了几件容易出错的事:Modifier 顺序有影响、Scaffold 要处理 padding、Button 的 onClick 和 content 都是 lambda、Toast 别忘了 .show()。
和课程整体有什么关系: 这些就是你后面写每个 screen 时会反复使用的基础组件和结构件。
Modifier 像“给组件加边距、颜色、点击能力的工具链”;
Button / TextField 像“具体家具”;
3. 老师强调的重点
下面这些是我根据 transcript 判断出来的“本周重点”:
Lambda 是本周第一核心。
老师几乎是明说了:今天如果只记住一个 take-away,就是 lambda;而且后面 composable functions 会“几乎一直用到”。这属于最强烈的重点信号。
val 和 var 的区别必须掌握。
老师明确提到这很可能在 quiz 里出现,而且她反复强调“默认优先 val,更安全”。这说明它既是语法重点,也是代码风格重点。
Null safety 是必须会的基础,不只是看懂定义。
老师不只是讲了 String?、?.、!!,还专门讨论了“哪里会抛异常、为什么安全调用能避免异常”。这很像 quiz / code reading 会考的点。
函数 vs 类:什么时候用哪一个,是隐含重点。
这部分课件没有展开太多,但老师讲得很久:函数适合无状态逻辑,类适合表示实体和状态。这明显不是随口一提,而是在给后面 app 设计铺路。
Preview functions 很重要。
老师直接说她在 lab 里反复强调 preview 的重要性,因为它比每次 run emulator 更轻、更快、更适合调 UI。只要老师专门停下来解释“为什么比 run 快”,通常就是实操重点。
Compose 的三阶段(composition / layout / drawing)很可能是考点。
老师明确说这“可能会 tested in a quiz”。而且她花了较长时间解释 UI tree 和 recomposition。
Modifier 的顺序、Scaffold 的 padding、Button/TextField 的 lambda 参数,是高频易错点。
这些不是最宏大的概念,但非常容易在写代码时出 bug,所以老师在口头里特地提醒。通常这种“容易错、经常用”的内容,就是 lab 和 assignment 的高频点。
Jetpack Compose 是这门课 assignment 的指定 UI 技术。
老师说得很硬:不是说其他技术不能做,而是这门课要给分,就按这个要求来。这已经不只是“建议”,而是作业约束。
4. transcript 里补充的重要信息
课件里有,但 transcript 讲得更清楚的地方,主要有这些:
Kotlin 不只是 Android 语言。
老师补充说它也能做 JVM 程序、跨平台场景,所以这节不是只在学“Android 小技巧”,而是在学一门现代语言的基本写法。
老师更偏爱函数式写法。
她强调 pure function、stateless、少 side effects,这一层在课件里基本没展开,但对写干净代码很重要。
类和函数的选择,是做 assignment 设计时要思考的。
这不是单纯语法,而是设计问题:要不要保存状态、是不是实体、会不会传来传去、要不要持久化。
Preview 为什么重要,老师讲得比课件详细。
她解释了 run/build 要走编译和设备运行流程,比较重;preview 更适合纯 UI 调试。这能帮助你理解“为什么老师老让你写 preview”。
UI tree 可以类比网页里的 DOM。
这个类比很有用。课件只说 tree structure,老师口头把它类比成 web 的树,让人更容易理解。
Modifier 不只是“加样式”,还管位置和行为。
老师口头把它解释成三类作用:styling、positioning、behavior,这比课件更好懂。
Toast 不是 composable function,而更像一种动作/提示。
老师特别提醒:makeText(...) 只是配置,别忘了 .show() 才会真正显示。这个很像 lab 里会踩的坑。
这周的作业/课程提醒也很重要。
老师强调:本周 assessment 1 相关安排很关键;lab 要按自己分配的班去,关系到选 paper;有问题尽快联系 tutor 并抄送老师;lab 3/4 资料已放 Moodle;lab solution 和 assessment 1 specification 预计周五下午发布。
我发现的细微冲突 / 需要你按“严格语法”理解的地方
我没有看到 实质性内容冲突,但有几处老师口头为了讲快而简化了,严格写代码时你要这样记:
String? 和 ?. 不是一回事。String? 是“可空类型声明”;?. 才是“安全调用”。课件第 10-11 页分得更清楚,口头里有时把“问号”统称成安全做法。
message?.length 的结果类型应理解为 Int?,不是普通 Int。
课件第 11 页写得很准确:如果前面的值可能为 null,那么结果也可能是 null。老师口头说明时把它说成了 integer,属于简化。
“trailing comma” 这个口头说法你别记偏。
你真正要记的是:主构造函数多个参数之间用逗号分隔;“最后再带一个逗号”只是 Kotlin 某些场景允许的语法细节,不是核心知识点。
5. 这周最可能要掌握的考点 / 作业相关点
更像 quiz / exam 的点
读代码识别结构题。
比如:找出 class、primary constructor、property、function、nullable variable、safe call、哪里可能抛异常。课件最后两页几乎已经在给你示范题型了。
val vs var。
这是老师直接点名“很可能 quiz 会考”的内容。
Null safety:String?、?.、!!、if 检查。
既容易出代码题,也容易出“哪个写法安全 / 哪个会报错”的判断题。
Lambda / higher-order function / it / trailing lambda。
这是老师最强调的语法点,而且和 Compose 紧密相连。
Compose 三阶段和 recomposition。
老师直接暗示可能考 quiz。
更像 assignment / lab 的点
写 composable function,并配 preview。
这是后面做 screen skeleton prototype 的直接基础。
用 Row / Column / Box 搭页面结构。
这是页面摆放的基本功。
会写 Button 的 onClick 和 TextField 的 onValueChange。
这两个场景是 lambda 在 Compose 里最典型的落地。
Modifier、Surface、Scaffold。
这些是做“像样页面”的基础。尤其 Scaffold 和 padding,很像 lab / prototype 要求里会用到的结构件。
隐含重点:状态思维。
虽然这周还没系统讲 state management,但老师已经在铺垫:什么是 state、什么时候要保存、为什么 recomposition 和 UI 更新有关。这是后面 Compose 学习的真正主线。
6. 我应该怎么学这周内容
推荐学习顺序
先把 Kotlin 最基础的符号搞懂: val / var、String?、?.、!!、fun、class。
再学“结构”: property、function、constructor、class body。
然后集中攻克 lambda: 看懂 { 参数 -> 行为 }、it、trailing lambda。
再进入 Compose: @Composable、@Preview、Button / TextField。
接着学布局: Row、Column、Box、Modifier。
最后补 mental model: composition、layout、drawing、recomposition。
我必须先搞懂的基础概念
val 和 var 的区别
可空类型 String?
安全调用 ?. 和危险调用 !!
lambda 的箭头 > 到底什么意思
@Composable 是什么
Row / Column / Box 分别怎么摆
哪些内容属于“理解型”
为什么 Kotlin 默认更推 val
为什么 null safety 能减少错误
为什么函数更适合无状态逻辑,类更适合实体和状态
Compose 为什么是声明式 UI
为什么状态变化会引起 recomposition
为什么 modifier 顺序会影响结果
哪些内容属于“记忆型”
哪些内容属于“应用型”
哪些内容只需要了解
哪些内容需要重点掌握
这周最容易混淆的地方
String? 和 ?.
?. 和 !!
val 不能改“引用” ≠ 对象内部一定完全不能变
constructor 参数 和 class property 不是同一个概念
普通函数 和 composable function
Button 的 onClick lambda 和 Button 里的 content lambda
Row / Column / Box 的使用场景
Surface 和 Scaffold 的区别
学完后你应该能回答这些问题
为什么老师说默认优先用 val?
message?.length 和 message!!.length 有什么本质区别?
lambda 为什么在 Compose 里这么常见?
onClick = { ... } 到底是在传什么?
什么时候该写 class,什么时候写 function?
@Preview 为什么能比 run emulator 更适合调 UI?
Row / Column / Box 各自适合什么布局?
Compose 的三阶段分别在干什么?
为什么数据一变,UI 能跟着更新?
7. 给我一份简短复习清单
8. 如果我是初学者,你再用更简单的话解释一遍
第一件事是:怎么用 Kotlin 写“不容易炸”的代码。
val 就像“先封好,别乱改”;var 才是“后面还能改”。
String? 的意思是“这个值可能没有”;?. 的意思是“有就继续,没有就算了”;!! 的意思是“我硬说它一定有”,所以风险最大。
Text、Button、TextField 是积木块;
为什么 lambda 重要?因为很多时候你不是在传“数据”,而是在传“等下要做什么”。
比如按钮被点了以后干什么、输入框变了以后干什么,这些“动作说明书”就是 lambda。
所以你看到 onClick = { ... },其实就是在说:“有人点它时,就按这张说明书执行。”
数据一变,受影响的那部分就重新更新,这就是为什么 Compose 很适合做现代 UI。
整体来说,这周真正要抓住的不是“背很多 API”,而是这条主线:
用 Kotlin 写安全代码,用 lambda 传行为,用 Compose 把 UI 组合出来。