# ICompose **Repository Path**: zhangkede/icompose ## Basic Information - **Project Name**: ICompose - **Description**: ICompose:一个专注于组件化开发的开源项目,提供丰富的模块和工具,助力开发者高效构建可维护、可扩展的应用。 对compose 进行封装,可直接拿来用 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-06-05 - **Last Updated**: 2026-06-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ICompose - Kotlin Multiplatform Compose Architecture > 一个现代化的 Kotlin Multiplatform 架构模板,支持 Android、iOS、Web、Desktop、HarmonyOS 多平台,采用 MVI + Clean Architecture 设计模式。 --- ## 📋 目录 - [项目概述](#-项目概述) - [功能特性](#-功能特性) - [技术栈](#-技术栈) - [支持平台](#-支持平台) - [架构设计](#-架构设计) - [核心组件](#-核心组件) - [使用示例](#-使用示例) - [快速开始](#-快速开始) - [构建命令](#-构建命令) - [测试指南](#-测试指南) - [代码规范](#-代码规范) - [常见问题](#-常见问题) - [更新日志](#-更新日志) - [架构参考](#-架构参考) - [代码贡献](#-代码贡献) - [作者信息](#-作者信息) --- ## 🌟 项目概述 ICompose 是一个基于 Kotlin Multiplatform 和 Compose Multiplatform 的现代化架构模板,旨在帮助开发者快速构建跨平台应用。 **核心特点:** - 🎯 **MVI 架构模式**:单向数据流,状态管理清晰 - 🧹 **Clean Architecture**:分层设计,职责分离 - 🎨 **Material3 主题系统**:支持动态主题切换 - 🌐 **多平台支持**:Android、iOS、Web、Desktop、HarmonyOS - ⚡ **高性能**:Kotlin/Native + NAPI 桥接(鸿蒙) - 🛡️ **线程安全**:所有共享状态均有线程安全保护 **架构优化重点:** - ✅ MVI 基类优化:修复 StateFlow 更新逻辑,确保线程安全 - ✅ 模块化分包规范:清晰的模块职责划分(core/app/server) - ✅ 路由 + 登录拦截:全局路由管理器,支持自动跳转登录页 - ✅ 分页 + 默认页面封装:BaseScreen 统一处理加载/空/错误状态 - ✅ M3 多主题:Light/Dark/System 三种模式,支持持久化 - ✅ KMP 跨平台:完整支持 Android/iOS/Web/Desktop/HarmonyOS --- ## ✨ 功能特性 ### 🎯 MVI 架构 - 单向数据流,状态管理清晰 - 线程安全的状态更新(StateFlow.update) - 生命周期感知的协程作用域 ### 🎨 主题系统 - Light/Dark/System 三种主题模式 - 主题持久化存储(DataStore/SharedPreferences/LocalStorage) - 动态主题切换,重启保留 ### 🌐 导航系统 - 全局路由管理器 - 登录拦截器,自动跳转登录页 - 支持路由参数传递和深度链接 ### 🚀 网络层 - Ktor 跨平台 HTTP 客户端 - 统一超时配置(30s 请求 / 10s 连接 / 60s 套接字) - ApiResult 密封类统一响应处理 ### 💾 数据层 - BaseRepository 安全调用封装 - 缓存策略(支持过期时间配置) - 支持多平台数据库(SQLDelight) ### 🛡️ 权限管理 - 平台无关的权限处理 - 常用权限定义(Camera、Location、Notification) - 权限状态枚举(Granted/Denied/DeniedPermanently) ### 📝 日志框架 - 分级日志系统(V/D/I/W/E/A) - 支持时间戳输出 - 多平台实现 ### ⚠️ 异常处理 - 全局异常捕获 - 支持异常上报扩展 - 提供多种包装方法 --- ## 🛠️ 技术栈 | 分类 | 技术 | 版本 | 说明 | |------|------|------|------| | 语言 | Kotlin | 2.4.0 | 主开发语言 | | 框架 | Compose Multiplatform | 1.11.1 | 跨平台 UI | | 网络 | Ktor | 3.5.0 | HTTP 客户端 | | 状态管理 | StateFlow/MVI | - | 单向数据流 | | 依赖注入 | Koin | 3.5.6 | 轻量级 DI | | 数据库 | SQLDelight | 2.0.0 | 跨平台数据库 | | 日志 | 自定义 Logger | - | 分级日志 | --- ## 📱 支持平台 | 平台 | 目标 | 构建方式 | |------|------|----------| | **Android** | API 24+ | `./gradlew :app:androidApp:assembleDebug` | | **iOS** | iOS 14+ | Xcode | | **Web** | Wasm/JS | `./gradlew :app:webApp:wasmJsBrowserDevelopmentRun` | | **Desktop** | JVM | `./gradlew :app:desktopApp:run` | | **HarmonyOS** | API 12+ | DevEco Studio | | **Server** | JVM | `./gradlew :server:run` | ### HarmonyOS 支持 采用 **Kotlin/Native + NAPI** 量产方案(字节 ByteKMP / 快手在用): **架构原理:** ``` KMP → KN 编译 libkmp.so → NAPI 桥接层 → ArkTS 双向调用 链路: Kotlin <-> C(NAPI) <-> ArkTS ``` **核心特性:** - 完整支持 coroutines、ktor、sql 全 KMP 生态 - 性能接近原生 C++ - Kotlin 与 ArkTS 双向调用 --- ## 🏗️ 架构设计 ### 模块结构 ``` ICompose/ ├── app/ │ ├── androidApp/ # Android 入口 │ ├── iosApp/ # iOS 入口 │ ├── desktopApp/ # Desktop 入口 │ ├── webApp/ # Web 入口 │ ├── harmonyApp/ # HarmonyOS 入口 │ └── shared/ # 共享 Compose UI ├── core/ # 核心架构组件 │ ├── compose/ # BaseScreen、SwipeRefresh、AppDialog │ ├── viewmodel/ # BaseMviVM、MVI 接口 │ ├── navigation/ # NavManager、拦截器 │ ├── theme/ # ThemeManager、Material3 主题 │ ├── net/ # KtorClient、ApiResult │ ├── repository/ # BaseRepository、缓存策略 │ ├── permission/ # 权限管理 │ ├── logger/ # 日志框架 │ ├── exception/ # 全局异常处理 │ └── di/ # Koin 依赖注入 └── server/ # Ktor 服务端 ``` ### 分层架构 | 层级 | 职责 | 示例 | |------|------|------| | **Presentation** | UI 展示、用户交互 | Screen、ViewModel | | **Domain** | 业务逻辑、UseCase | Repository 接口 | | **Data** | 数据获取、缓存 | Repository 实现 | | **Core** | 基础组件、工具类 | 主题、路由、网络 | --- ## 🧩 核心组件 ### 1. MVI 架构 **BaseMviVM** - MVI ViewModel 基类 - Event → State → SideEffect 单向数据流 - 线程安全的状态更新(使用 `StateFlow.update()`) - 生命周期感知的协程作用域 **相关文件:** - [BaseMviVM.kt](core/src/commonMain/kotlin/com/pragmatic/icompose/viewmodel/BaseMviVM.kt) - [MviEvent/MviState/MviSideEffect](core/src/commonMain/kotlin/com/pragmatic/icompose/viewmodel/BaseMviVM.kt) ### 2. BaseScreen 组件 **功能特性:** - 加载/空/错误状态统一处理 - 内置下拉刷新 - 自动分页支持 - 滚动状态感知的刷新手势 **相关文件:** - [BaseScreen.kt](core/src/commonMain/kotlin/com/pragmatic/icompose/compose/BaseScreen.kt) - [SwipeRefresh.kt](core/src/commonMain/kotlin/com/pragmatic/icompose/compose/SwipeRefresh.kt) ### 3. 导航系统 **NavManager** - 全局路由管理器 - 支持路由参数传递 - 登录拦截器(LoginInterceptor) - 线程安全的事件发送 **相关文件:** - [NavManager.kt](file:///d:/workspace/ICompose/core/src/commonMain/kotlin/com/pragmatic/icompose/navigation/NavManager.kt) - [LoginInterceptor.kt](file:///d:/workspace/ICompose/core/src/commonMain/kotlin/com/pragmatic/icompose/navigation/NavManager.kt) ### 4. 主题系统 **ThemeManager** - 主题状态管理 - Light/Dark/System 三种模式 - 主题持久化(DataStore/SharedPreferences) - 多平台支持 **相关文件:** - [ThemeManager.kt](file:///d:/workspace/ICompose/core/src/commonMain/kotlin/com/pragmatic/icompose/theme/ThemeManager.kt) - [ThemePreferences.kt](file:///d:/workspace/ICompose/core/src/commonMain/kotlin/com/pragmatic/icompose/theme/ThemePreferences.kt) ### 5. 网络层 **KtorClient** - 跨平台 HTTP 客户端 - 统一超时配置(30s 请求 / 10s 连接 / 60s 套接字) - ApiResult 密封类统一响应处理 - 全局异常处理(401/403/404/超时等) **相关文件:** - [KtorClient.kt](file:///d:/workspace/ICompose/core/src/commonMain/kotlin/com/pragmatic/icompose/net/KtorClient.kt) - [ApiResult.kt](file:///d:/workspace/ICompose/core/src/commonMain/kotlin/com/pragmatic/icompose/net/ApiResult.kt) ### 6. Repository 层 **BaseRepository** - 数据仓库基类 - safeApiCall 安全调用 - withCache 缓存策略(支持过期时间配置) - CacheEntry 带时间戳的缓存实体 **相关文件:** - [BaseRepository.kt](file:///d:/workspace/ICompose/core/src/commonMain/kotlin/com/pragmatic/icompose/repository/BaseRepository.kt) ### 7. 权限管理 **PermissionManager** - 平台无关的权限处理 - 常用权限定义(Camera、Location、Notification) - 权限状态枚举(Granted/Denied/DeniedPermanently) - 多平台适配 **相关文件:** - [PermissionManager.kt](file:///d:/workspace/ICompose/core/src/commonMain/kotlin/com/pragmatic/icompose/permission/PermissionManager.kt) ### 8. UI 组件库 | 组件 | 说明 | 文件 | |------|------|------| | AppButton | Material3 按钮变体 | [AppButton.kt](file:///d:/workspace/ICompose/core/src/commonMain/kotlin/com/pragmatic/icompose/widget/AppButton.kt) | | AppListItem | 列表项组件 | [AppListItem.kt](file:///d:/workspace/ICompose/core/src/commonMain/kotlin/com/pragmatic/icompose/widget/AppListItem.kt) | | AppDialog | 通用对话框 | [AppDialog.kt](file:///d:/workspace/ICompose/core/src/commonMain/kotlin/com/pragmatic/icompose/compose/AppDialog.kt) | ### 9. 日志框架 **Logger** - 分级日志系统 - 支持 V/D/I/W/E/A 六个级别 - 支持时间戳输出 - 多平台实现(JVM/JS/Android) **相关文件:** - [Logger.kt](file:///d:/workspace/ICompose/core/src/commonMain/kotlin/com/pragmatic/icompose/logger/Logger.kt) - [ConsoleLogger.kt](file:///d:/workspace/ICompose/core/src/jvmMain/kotlin/com/pragmatic/icompose/logger/ConsoleLogger.kt) ### 10. 全局异常处理 **ExceptionManager** - 统一异常处理 - 全局异常捕获 - 支持异常上报扩展 - 提供多种包装方法(wrap/wrapSuspend/wrapWithResult) **相关文件:** - [GlobalExceptionHandler.kt](file:///d:/workspace/ICompose/core/src/commonMain/kotlin/com/pragmatic/icompose/exception/GlobalExceptionHandler.kt) ### 11. 依赖注入 **Koin** - 轻量级依赖注入框架 - 多平台 Module 配置 - 单例管理(Logger、NavManager、ThemeManager) **相关文件:** - [AppModule.kt](core/src/commonMain/kotlin/com/pragmatic/icompose/di/AppModule.kt) --- ## 🚀 使用示例 ### 1. 创建 MVI ViewModel ```kotlin sealed class HomeEvent : MviEvent { object LoadData : HomeEvent() object Refresh : HomeEvent() data class ItemClick(val id: String) : HomeEvent() } data class HomeState( val isLoading: Boolean = false, val isLoadingMore: Boolean = false, val data: List = emptyList(), val hasMore: Boolean = true, val error: String? = null ) : MviState sealed class HomeEffect : MviSideEffect { data class NavigateToDetail(val id: String) : HomeEffect() object ShowToast : HomeEffect() } class HomeViewModel : BaseMviVM(HomeState()) { override fun onEvent(event: HomeEvent) { when (event) { HomeEvent.LoadData -> loadData() HomeEvent.Refresh -> refreshData() is HomeEvent.ItemClick -> handleItemClick(event.id) } } private fun loadData() { setState { copy(isLoading = true) } // 协程执行数据请求 viewModelScope.launch { val result = repository.fetchItems() when (result) { is ApiResult.Success -> { setState { copy(isLoading = false, data = result.data) } } is ApiResult.Error -> { setState { copy(isLoading = false, error = result.exception.message) } } } } } private fun refreshData() { setState { copy(data = emptyList(), hasMore = true) } loadData() } private fun handleItemClick(id: String) { sendSideEffect(HomeEffect.NavigateToDetail(id)) } } ``` ### 2. 使用 BaseScreen ```kotlin @Composable fun HomeScreen(viewModel: HomeViewModel = koinInject()) { val state = viewModel.collectState() val lazyListState = rememberLazyListState() LaunchedEffect(Unit) { viewModel.onEvent(HomeEvent.LoadData) } BaseScreen( state = when { state.isLoading -> ScreenState.Loading state.error != null -> ScreenState.Error(state.error) state.data.isEmpty() -> ScreenState.Empty else -> ScreenState.Success( data = state.data, isLoadingMore = state.isLoadingMore, hasMore = state.hasMore ) }, onRefresh = { viewModel.onEvent(HomeEvent.Refresh) }, onLoadMore = { /* 加载更多逻辑 */ }, lazyListState = lazyListState ) { items -> LazyColumn(state = lazyListState) { items(items) { item -> AppListItem( title = item.title, subtitle = item.description, onClick = { viewModel.onEvent(HomeEvent.ItemClick(item.id)) } ) } } } } ``` ### 3. 导航与路由拦截 ```kotlin // 初始化导航拦截器 val loginInterceptor = LoginInterceptor( isLoggedIn = { AuthManager.isLoggedIn }, loginRoute = "login" ).apply { addProtectedRoutes(listOf("profile", "settings", "payment", "order")) } NavManager.addInterceptor(loginInterceptor) // 页面跳转 NavManager.navigateTo("profile") NavManager.navigateTo("detail", mapOf("id" to "123")) NavManager.navigateBack() NavManager.navigateToRoot("home") ``` ### 4. 主题切换与持久化 ```kotlin // 切换主题 ThemeManager.setTheme(ThemeMode.Dark) ThemeManager.toggleTheme() // 保存/加载主题(需在协程中调用) val preferences = ThemePreferences(context) ThemeManager.saveTheme(preferences) ThemeManager.loadTheme(preferences) // 应用主题 AppTheme { MainScreen() } ``` ### 5. 网络请求 ```kotlin // 初始化(Application 启动时) KtorClient.init("https://api.example.com") // 发起请求 suspend fun fetchUser(id: String): ApiResult { return KtorClient.get("/api/users/$id") } // 处理响应 when (val result = fetchUser("123")) { is ApiResult.Loading -> // 显示加载状态 is ApiResult.Success -> { val user = result.data // 更新 UI } is ApiResult.Error -> { when (result.exception) { is ApiException.AuthException -> // 跳转到登录 is ApiException.ServerException -> // 显示服务器错误 is ApiException.NetworkException -> // 显示网络错误 } } } ``` ### 6. Repository 缓存策略 ```kotlin class UserRepository : BaseRepository() { private val cache = mutableMapOf>() suspend fun getUser(id: String): ApiResult { return withCache( cacheKey = "user_$id", config = CacheConfig( expireTimeMs = 10 * 60 * 1000, // 10分钟过期 maxSize = 50 ), fetchFromRemote = { KtorClient.get("/api/users/$id") }, getFromCache = { cache["user_$id"] }, saveToCache = { cache["user_$id"] = it }, removeFromCache = { cache.remove(it) }, onCacheHit = { Log.d("Cache", "User $id hit from cache") }, onCacheMiss = { Log.d("Cache", "User $id fetching from remote") } ) } } ``` ### 7. 权限请求 ```kotlin val permissionManager: PermissionManager = PlatformPermissionManager() // 请求单个权限 val cameraResult = permissionManager.requestPermission(Permission.Camera) when (cameraResult) { PermissionResult.Granted -> // 权限已授予 PermissionResult.Denied -> // 权限被拒绝,显示理由 PermissionResult.DeniedPermanently -> // 权限永久拒绝,引导到设置 } // 请求多个权限 val results = permissionManager.requestPermissions( listOf(Permission.Camera, Permission.Location) ) ``` ### 8. 日志使用 ```kotlin // 初始化日志 Log.logger = ConsoleLogger( minLevel = LogLevel.DEBUG, showTimestamp = true ) // 使用日志 Log.v("TAG", "Verbose message") Log.d("TAG", "Debug message") Log.i("TAG", "Info message") Log.w("TAG", "Warning message") Log.e("TAG", "Error message") Log.e("TAG", "Error with exception", exception) ``` ### 9. 全局异常处理 ```kotlin // 初始化异常处理器 ExceptionManager.initialize(DefaultExceptionHandler()) // 包装同步代码 ExceptionManager.wrap { // 可能抛出异常的代码 } // 包装挂起函数 val result = ExceptionManager.wrapSuspend { // 挂起函数调用 } // 包装并返回 Result val result = ExceptionManager.wrapWithResult { // 可能抛出异常的代码 } ``` --- ## 🛠️ 快速开始 ### 环境要求 - **JDK**: 21+ - **Android Studio**: Hedgehog (2023.1.1) 或更高 - **Xcode**: 15+ (iOS 开发) - **DevEco Studio**: 5.0+ (HarmonyOS 开发,支持 API 12+) ### 项目初始化 ```bash # 克隆项目 git clone https://gitee.com/zhangkede/icompose.git cd icompose # 初始化 Git 远程 git remote add origin https://gitee.com/zhangkede/icompose.git git branch -M main git push -u origin main ``` ### 构建命令 ```bash # Android ./gradlew :app:androidApp:assembleDebug ./gradlew :app:androidApp:installDebug # Desktop ./gradlew :app:desktopApp:run # 标准运行 ./gradlew :app:desktopApp:hotRun --auto # 热重载 # Web (Wasm) ./gradlew :app:webApp:wasmJsBrowserDevelopmentRun # Web (JS) ./gradlew :app:webApp:jsBrowserDevelopmentRun # Server ./gradlew :server:run # HarmonyOS ./gradlew :core:compileOpenHarmonyMainKotlinMetadata ./gradlew :app:harmonyApp:assembleHap # iOS (需在 macOS 环境) ./gradlew :app:shared:compileKotlinIosSimulatorArm64 ``` --- ## ✅ 测试指南 ### 运行测试 ```bash # Android 测试 ./gradlew :app:shared:testAndroidHostTest # Desktop 测试 ./gradlew :app:shared:jvmTest # Server 测试 ./gradlew :server:test # Web 测试 ./gradlew :app:shared:wasmJsTest ./gradlew :app:shared:jsTest # iOS 测试 ./gradlew :app:shared:iosSimulatorArm64Test # 运行所有测试 ./gradlew test ``` ### 测试覆盖率 ```bash # 生成覆盖率报告 ./gradlew koverMergedReport # 查看报告 open build/reports/kover/html/index.html ``` --- ## 📄 代码规范 ### 代码风格 - **Kotlin 官方规范**: 遵循 [Kotlin Coding Conventions](https://kotlinlang.org/docs/coding-conventions.html) - **缩进**: 4 空格 - **命名**: 驼峰命名法(CamelCase) - **文件长度**: 单个文件不超过 500 行 ### 提交规范 ``` (): ``` **类型说明:** - `feat`: 新功能 - `fix`: 修复 bug - `docs`: 文档更新 - `style`: 代码格式化(不影响逻辑) - `refactor`: 重构(既不新增功能也不修复 bug) - `test`: 测试相关 - `chore`: 构建/工具/配置更新 --- ## ❓ 常见问题 ### Q: 如何添加新的业务模块? A: 创建新的模块目录,继承 `BaseMviVM`,实现对应的 `Screen` 组件,在 `NavManager` 中注册路由。 ### Q: 如何支持新的平台? A: 在 `build.gradle.kts` 中添加平台目标,创建对应的平台特定实现文件(如 `iosMain`、`jvmMain`、`openHarmonyMain`)。 ### Q: 如何配置网络请求超时? A: 在 `KtorClient.init()` 前配置,或在 `KtorClient.kt` 中修改默认超时时间。 ### Q: 如何自定义主题颜色? A: 修改 `AppTheme.kt` 中的颜色配置,或通过 `ThemeManager` 动态切换主题。 ### Q: 如何实现登录拦截? A: 使用 `LoginInterceptor`,添加受保护的路由列表,当用户未登录时自动跳转到登录页。 ### Q: 如何处理网络异常? A: 使用 `ApiResult` 密封类处理不同类型的错误(401、403、404、网络错误等),并在 UI 层展示相应提示。 ### Q: 如何使用缓存? A: 在 `Repository` 中使用 `withCache` 方法,配置缓存过期时间和最大缓存数量。 ### Q: 如何请求权限? A: 使用 `PermissionManager`,调用 `requestPermission` 或 `requestPermissions` 方法,处理三种状态(Granted/Denied/DeniedPermanently)。 --- ## 📜 更新日志 ### v1.1.0 (2026-06-05) - ✅ 修复 Compose 编译器内联错误 - ✅ 修复 Ktor wasm-js 依赖问题(改用 ktor-client-js) - ✅ 修复 expect/actual 声明不匹配问题 - ✅ 添加 jsMain 平台实现(ThemePreferences、KtorClient、ApiResult) - ✅ 添加 wasmJsMain 平台实现(ThemePreferences、KtorClient、ApiResult) - ✅ 添加 jvmMain 平台实现(ApiResult) - ✅ 修复 Logger 期望/实际声明冲突 - ✅ 修复 MVI StateFlow 更新逻辑 - ✅ 优化 BaseScreen 下拉刷新实现 ### v1.0.0 (2026-06-05) - ✅ 初始版本发布 - ✅ 支持 Android、iOS、Web、Desktop、HarmonyOS - ✅ 实现 MVI + Clean Architecture - ✅ 提供完整的核心组件封装 - ✅ 线程安全的状态管理 - ✅ Material3 主题系统 - ✅ 全局路由导航系统 - ✅ Ktor 网络层封装 - ✅ 权限管理模块 - ✅ 日志框架 - ✅ 全局异常处理 - ✅ Koin 依赖注入集成 --- ## 🌍 架构参考 ### Google 官方示例 | 项目 | 描述 | 链接 | |------|------|------| | **NowInAndroid** | Google 主推的模块化 Clean Architecture 示例,包含完整的 M3 主题、导航、分页实现 | [github.com/android/nowinandroid](https://github.com/android/nowinandroid) | | **compose-samples** | 官方 Compose 示例集合,包含 Jetcaster、Reply 等完整商用级 Demo | [github.com/android/compose-samples](https://github.com/android/compose-samples) | ### 大厂架构框架 | 项目 | 公司 | 描述 | 链接 | |------|------|------|------| | **Circuit** | Slack | 自研 Compose 架构框架,Presenter→UI 单向数据流,内置路由和状态管理 | [github.com/slackhq/circuit](https://github.com/slackhq/circuit) | | **Orbit MVI** | 社区 | 成熟的 MVI 状态管理库,替代原生 ViewModel 手写 MVI | [github.com/orbit-mvi/orbit](https://github.com/orbit-mvi/orbit) | | **Decompose** | Arkivanov | 跨端导航 + 状态管理标杆,广泛应用于 B 站 IM、海外电商 | [github.com/arkivanov/Decompose](https://github.com/arkivanov/Decompose) | ### KMP 跨端项目 | 项目 | 描述 | 链接 | |------|------|------| | **Notflix** | Kotlin 官方影视跨端 Demo,支持 Android/iOS/Desktop | [github.com/Kotlin/notflix](https://github.com/Kotlin/notflix) | | **MVIKotlin** | 工业级跨端 MVI 架构,与 Decompose 配套使用 | [github.com/arkivanov/MVIKotlin](https://github.com/arkivanov/MVIKotlin) | ### Clean Architecture 模板 | 项目 | 描述 | 链接 | |------|------|------| | **Android-Clean-Architecture** | 标准的 Clean Architecture 模板,包含全量单元测试 | [github.com/AliAsadi/Android-Clean-Architecture](https://github.com/AliAsadi/Android-Clean-Architecture) | | **Netflix-Composable** | 网飞的 Clean Architecture 模板,分包规范、UseCase 统一封装 | [github.com/skydoves/Netflix-Composable](https://github.com/skydoves/Netflix-Composable) | ### 国内优秀项目 | 项目 | 描述 | 链接 | |------|------|------| | **GSYGithubAppCompose** | 国内最火的 Clean Compose 项目,全套通用封装 | [github.com/GuoYangGit/GSYGithubAppCompose](https://github.com/GuoYangGit/GSYGithubAppCompose) | | **PlayAndroidCompose** | 玩安卓 API 实战,包含登录拦截路由、全局异常弹窗 | [github.com/shenshizhouxin/PlayAndroidCompose](https://github.com/shenshizhouxin/PlayAndroidCompose) | --- ## 🤝 代码贡献 欢迎提交 Issue 和 Pull Request! ### 贡献流程 1. Fork 仓库 2. 创建功能分支 (`git checkout -b feature/xxx`) 3. 提交代码 (`git commit -m "feat: xxx"`) 4. 推送到分支 (`git push origin feature/xxx`) 5. 创建 Pull Request --- ## 🌍 国外优秀架构参考 ### Google 官方示例 | 项目 | 描述 | 链接 | |------|------|------| | **NowInAndroid** | Google 主推的模块化 Clean Architecture 示例,包含完整的 M3 主题、导航、分页实现 | [github.com/android/nowinandroid](https://github.com/android/nowinandroid) | | **compose-samples** | 官方 Compose 示例集合,包含 Jetcaster、Reply 等完整商用级 Demo | [github.com/android/compose-samples](https://github.com/android/compose-samples) | ### 大厂架构框架 | 项目 | 公司 | 描述 | 链接 | |------|------|------|------| | **Circuit** | Slack | 自研 Compose 架构框架,Presenter→UI 单向数据流,内置路由和状态管理 | [github.com/slackhq/circuit](https://github.com/slackhq/circuit) | | **Orbit MVI** | 社区 | 成熟的 MVI 状态管理库,替代原生 ViewModel 手写 MVI | [github.com/orbit-mvi/orbit](https://github.com/orbit-mvi/orbit) | | **Decompose** | Arkivanov | 跨端导航 + 状态管理标杆,广泛应用于 B 站 IM、海外电商 | [github.com/arkivanov/Decompose](https://github.com/arkivanov/Decompose) | ### KMP 跨端项目 | 项目 | 描述 | 链接 | |------|------|------| | **Notflix** | Kotlin 官方影视跨端 Demo,支持 Android/iOS/Desktop | [github.com/Kotlin/notflix](https://github.com/Kotlin/notflix) | | **MVIKotlin** | 工业级跨端 MVI 架构,与 Decompose 配套使用 | [github.com/arkivanov/MVIKotlin](https://github.com/arkivanov/MVIKotlin) | ### Clean Architecture 模板 | 项目 | 描述 | 链接 | |------|------|------| | **Android-Clean-Architecture** | 标准的 Clean Architecture 模板,包含全量单元测试 | [github.com/AliAsadi/Android-Clean-Architecture](https://github.com/AliAsadi/Android-Clean-Architecture) | | **Netflix-Composable** | 网飞的 Clean Architecture 模板,分包规范、UseCase 统一封装 | [github.com/skydoves/Netflix-Composable](https://github.com/skydoves/Netflix-Composable) | ### 国内优秀项目 | 项目 | 描述 | 链接 | |------|------|------| | **GSYGithubAppCompose** | 国内最火的 Clean Compose 项目,全套通用封装 | [github.com/GuoYangGit/GSYGithubAppCompose](https://github.com/GuoYangGit/GSYGithubAppCompose) | | **PlayAndroidCompose** | 玩安卓 API 实战,包含登录拦截路由、全局异常弹窗 | [github.com/shenshizhouxin/PlayAndroidCompose](https://github.com/shenshizhouxin/PlayAndroidCompose) | --- ## 👤 作者信息 **张科** - 高级 Android/KMP 开发者 📧 **邮箱**: 834959743@qq.com 📞 **电话**: 16657156689 🔗 **GitHub**: [@zhangkede](https://github.com/zhangkede) 💼 **Gitee**: [@zhangkede](https://gitee.com/zhangkede) 📱 **微信**: zhangkede_wx(备注:ICompose) 📝 **掘金**: [zhangkede](https://juejin.cn/user/zhangkede) 💼 **LinkedIn**: [zhangkede](https://linkedin.com/in/zhangkede) 🐦 **Twitter**: [@zhangkede_dev](https://twitter.com/zhangkede_dev) --- ## 🔔 推送订阅 ### 关注更新 - 📧 **邮件订阅**: [订阅技术博客更新](mailto:zhangkede.dev@gmail.com?subject=Subscribe%20ICompose) - 🌟 **Star 项目**: 在 GitHub/Gitee 上 Star 项目,获取版本更新通知 - 📢 **Discord**: [加入 Discord 社区](https://discord.gg/icompose) - 📱 **Telegram**: [加入 Telegram 群组](https://t.me/icompose_chat) ### 接收推送 - **版本更新**: 发布新版本时自动收到通知 - **技术文章**: 定期分享 KMP/Compose 技术文章 - **问题解答**: 及时获取常见问题解决方案 - **社区活动**: 参与线上分享和讨论 --- ## 📄 许可证 ``` Copyright 2024 Zhang Kede Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ``` --- *Built with ❤️ using Kotlin Multiplatform & Compose Multiplatform* --- **Learn more about:** - [Kotlin Multiplatform](https://www.jetbrains.com/help/kotlin-multiplatform-dev/get-started.html) - [Compose Multiplatform](https://github.com/JetBrains/compose-multiplatform/#compose-multiplatform) - [Kotlin/Wasm](https://kotl.in/wasm/) 如果您有任何问题或建议,请在 [Issues](https://gitee.com/zhangkede/icompose/issues) 中提出。