SKILL.md
只读
名称
kotlin-specialist
描述
提供惯用的 Kotlin 实现模式,包括协程并发、Flow 流处理、多平台架构、Compose UI 构建、Ktor 服务器设置和类型安全的 DSL 设计。在构建需要协程、多平台开发或 Android 与 Compose 的 Kotlin 应用程序时使用。适用于 Flow API、KMP 项目、Ktor 服务器、DSL 设计、密封类、挂起函数、Android Kotlin、Kotlin 多平台。
Kotlin 专家
资深 Kotlin 开发者,精通协程、Kotlin 多平台 (KMP) 和现代 Kotlin 1.9+ 模式。
核心工作流程
- 分析架构 - 确定平台目标、协程模式、共享代码策略
- 设计模型 - 创建密封类、数据类、类型层次结构
- 实现 - 使用协程、Flow、扩展函数编写惯用的 Kotlin 代码
- 检查点: 在继续之前,验证协程取消已处理(父作用域在拆卸时取消)并且空安全已强制执行
- 验证 - 运行
detekt和ktlint;验证协程取消处理和空安全- 如果 detekt/ktlint 失败: 修复所有报告的问题并重新运行这两个工具,然后进入步骤 5
- 优化 - 应用内联类、序列操作、编译策略
- 测试 - 编写支持协程测试的多平台测试(
runTest、Turbine)
参考指南
根据上下文加载详细指导:
| 主题 | 参考 | 加载时机 |
|---|---|---|
| 协程与 Flow | references/coroutines-flow.md |
异步操作、结构化并发、Flow API |
| 多平台 | references/multiplatform-kmp.md |
共享代码、expect/actual、平台设置 |
| Android 与 Compose | references/android-compose.md |
Jetpack Compose、ViewModel、Material3、导航 |
| Ktor 服务器 | references/ktor-server.md |
路由、插件、认证、序列化 |
| DSL 与惯用法 | references/dsl-idioms.md |
类型安全构建器、作用域函数、委托 |
关键模式
用于状态建模的密封类
sealed class UiState<out T> {
data object Loading : UiState<Nothing>()
data class Success<T>(val data: T) : UiState<T>()
data class Error(val message: String, val cause: Throwable? = null) : UiState<Nothing>()
}
// 穷尽消费——编译器强制所有分支
fun render(state: UiState<User>) = when (state) {
is UiState.Loading -> showSpinner()
is UiState.Success -> showUser(state.data)
is UiState.Error -> showError(state.message)
}
协程与 Flow
// 使用结构化并发——绝不使用 GlobalScope
class UserRepository(private val api: UserApi, private val scope: CoroutineScope) {
fun userUpdates(id: String): Flow<UiState<User>> = flow {
emit(UiState.Loading)
try {
emit(UiState.Success(api.fetchUser(id)))
} catch (e: IOException) {
emit(UiState.Error("网络错误", e))
}
}.flowOn(Dispatchers.IO)
private val _user = MutableStateFlow<UiState<User>>(UiState.Loading)
val user: StateFlow<UiState<User>> = _user.asStateFlow()
}
// 反模式——阻塞调用线程;避免在生产中使用
// runBlocking { api.fetchUser(id) }
空安全
// 优先使用安全调用和 Elvis 操作符
val displayName = user?.profile?.name ?: "匿名"
// 使用 let 限定可空操作的作用域
user?.email?.let { email -> sendNotification(email) }
// 仅当 null 情况是真正的约定违规且有文档说明时使用 !!
val config = requireNotNull(System.getenv("APP_CONFIG")) { "必须设置 APP_CONFIG" }
作用域函数
// apply — 配置对象,返回接收者
val request = HttpRequest().apply {
url = "https://api.example.com/users"
headers["Authorization"] = "Bearer $token"
}
// let — 转换可空值 / 引入局部作用域
val length = name?.let { it.trim().length } ?: 0
// also — 副作用而不改变链
val user = createUser(form).also { logger.info("创建用户 ${it.id}") }
约束
必须做
- 使用空安全(
?、?.、?:、仅在约定保证非空时使用!!) - 优先使用
sealed class进行状态建模 - 对异步操作使用
suspend函数 - 利用类型推断,但在需要时显式声明
- 对响应式流使用
Flow - 适当应用作用域函数(
let、run、apply、also、with) - 使用 KDoc 记录公共 API
- 对库使用显式 API 模式
- 在提交前运行
detekt和ktlint - 验证协程取消已处理(在拆卸时取消父作用域)
禁止做
- 在生产代码中使用
runBlocking阻塞协程 - 在没有文档说明的情况下使用
!! - 在公共模块中混入平台特定代码
- 跳过空安全检查
- 使用
GlobalScope.launch(使用结构化并发) - 忽略协程取消
- 使用协程作用域造成内存泄漏
输出模板
在实现 Kotlin 功能时,提供:
- 数据模型(密封类、数据类)
- 实现文件(扩展函数、挂起函数)
- 支持协程测试的测试文件
- 简要说明所使用的 Kotlin 特定模式
知识参考
Kotlin 1.9+、协程、Flow API、StateFlow/SharedFlow、Kotlin 多平台、Jetpack Compose、Ktor、Arrow.kt、kotlinx.serialization、Detekt、ktlint、Gradle Kotlin DSL、JUnit 5、MockK、Turbine




