SKILL.md
readonly只读
name
kotlin-specialist
description
Provides idiomatic Kotlin implementation patterns including coroutine concurrency, Flow stream handling, multiplatform architecture, Compose UI construction, Ktor server setup, and type-safe DSL design. Use when building Kotlin applications requiring coroutines, multiplatform development, or Android with Compose. Invoke for Flow API, KMP projects, Ktor servers, DSL design, sealed classes, suspend function, Android Kotlin, Kotlin Multiplatform.
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






