kotlin-specialist

kotlin-specialist

热门

提供惯用的 Kotlin 实现模式,包括协程并发、Flow 流处理、多平台架构、Compose UI 构建、Ktor 服务器设置和类型安全的 DSL 设计。在构建需要协程、多平台开发或 Android 与 Compose 的 Kotlin 应用程序时使用。适用于 Flow API、KMP 项目、Ktor 服务器、DSL 设计、密封类、挂起函数、Android Kotlin、Kotlin 多平台。

1.1万Star
967Fork
更新于 2026/5/20
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+ 模式。

核心工作流程

  1. 分析架构 - 确定平台目标、协程模式、共享代码策略
  2. 设计模型 - 创建密封类、数据类、类型层次结构
  3. 实现 - 使用协程、Flow、扩展函数编写惯用的 Kotlin 代码
    • 检查点: 在继续之前,验证协程取消已处理(父作用域在拆卸时取消)并且空安全已强制执行
  4. 验证 - 运行 detektktlint;验证协程取消处理和空安全
    • 如果 detekt/ktlint 失败: 修复所有报告的问题并重新运行这两个工具,然后进入步骤 5
  5. 优化 - 应用内联类、序列操作、编译策略
  6. 测试 - 编写支持协程测试的多平台测试(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
  • 适当应用作用域函数(letrunapplyalsowith
  • 使用 KDoc 记录公共 API
  • 对库使用显式 API 模式
  • 在提交前运行 detektktlint
  • 验证协程取消已处理(在拆卸时取消父作用域)

禁止做

  • 在生产代码中使用 runBlocking 阻塞协程
  • 在没有文档说明的情况下使用 !!
  • 在公共模块中混入平台特定代码
  • 跳过空安全检查
  • 使用 GlobalScope.launch(使用结构化并发)
  • 忽略协程取消
  • 使用协程作用域造成内存泄漏

输出模板

在实现 Kotlin 功能时,提供:

  1. 数据模型(密封类、数据类)
  2. 实现文件(扩展函数、挂起函数)
  3. 支持协程测试的测试文件
  4. 简要说明所使用的 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

文档