ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Koin for Compose 实战指南:Jetpack Compose 与 Compose Multiplatform 依赖注入全解析

Koin for Compose 实战指南:Jetpack Compose 与 Compose Multiplatform 依赖注入全解析 Koin for Compose 实战指南Jetpack Compose 与 Compose Multiplatform 依赖注入全解析【免费下载链接】koinKoin - a pragmatic lightweight dependency injection framework for Kotlin Kotlin Multiplatform项目地址: https://gitcode.com/gh_mirrors/ko/koinKoin 为 Jetpack Compose 与 Compose MultiplatformAndroid / iOS / Desktop / Web提供了完整的依赖注入支持通过koin-compose、koin-compose-viewmodel等专门封装包让 Composable 函数可以直接以koinInject()、koinViewModel()等组合函数完成注入并与组合Composition生命周期深度绑定。本文以官方文档 docs/reference/koin-compose/compose.md 为主体骨架结合仓库源码与示例工程系统讲解包选型、Koin 启动方式、基础注入、模块定义、动态模块与作用域等核心能力读完后你将能够在 Android 与跨平台 Compose 项目中正确、高效地接入 Koin。包结构总览与选型Koin 针对不同 Compose 使用场景拆分出多个包各自职责如下包名使用场景koin-compose基础 Compose API多平台koin-compose-viewmodelViewModel 注入多平台koin-compose-viewmodel-navigationViewModel Navigation 2.xkoin-compose-navigation3Navigation 3 集成多平台koin-androidx-composeAndroid 便捷封装包含 koin-compose koin-compose-viewmodel其中所有 Compose API 都定义在koin-compose与koin-compose-viewmodel中koin-androidx-compose只是一个便捷包装包面向 Android 工程把两者一并带入。从源码结构看koin-compose的核心 API 分布在 projects/compose/koin-compose/src/commonMain/kotlin/org/koin/compose 下Inject.ktkoinInject、KoinApplication.kt组合级启动与上下文、module/动态模块、scope/作用域而 ViewModel 注入集中在 projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/ViewModel.kt。该用哪个包Android-only 工程三选一或组合使用// 方案 1Android 便捷包已包含 koin-compose koin-compose-viewmodel implementation(io.insert-koin:koin-androidx-compose:$koin_version) // 方案 2直接使用多平台包 implementation(io.insert-koin:koin-compose:$koin_version) implementation(io.insert-koin:koin-compose-viewmodel:$koin_version) // 可选Navigation 集成 implementation(io.insert-koin:koin-androidx-compose-navigation:$koin_version)Compose Multiplatform 工程Android/iOS/Desktop 共享 UI在commonMain中声明commonMain.dependencies { implementation(io.insert-koin:koin-compose:$koin_version) implementation(io.insert-koin:koin-compose-viewmodel:$koin_version) // 可选Navigation 集成 implementation(io.insert-koin:koin-compose-viewmodel-navigation:$koin_version) }koin_version为当前使用的 Koin 版本号。仓库自身的版本目录 projects/gradle/libs.versions.toml 也印证了多平台 Compose 依赖的搭配方式AndroidX Compose / JetBrains Composejb-compose以及org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose等运行时依赖由各模块按平台分别解析。平台支持矩阵平台Compose 类型状态AndroidJetpack Compose完整支持iOSCompose Multiplatform完整支持DesktopCompose Desktop完整支持WebCompose for Web实验性启动 Koin两种方式与背后的组合生命周期机制方式一startKoinAndroid-only 或外部初始化在 Compose 之外完成 Koin 初始化获得完全控制权适合需要自定义配置或与其它框架集成如 Ktor、WorkManager的场景// Android Application 类 class MyApplication : Application() { override fun onCreate() { super.onCreate() startKoin { androidContext(thisMyApplication) androidLogger() modules(appModule) } } } // Compose UI 直接使用 Koin Composable fun App() { val viewModel koinViewModelMyViewModel() }这种方式的示例可参考仓库中的 examples/sample-android-compose/src/main/java/org/koin/sample/androidx/compose/MainApplication.kt其中还设置了androidLogger(Level.DEBUG)便于调试。适用场景需要完全控制 Koin 生命周期、自定义配置或与其它框架集成。方式二KoinApplication由 Compose 管理让 Compose 自动完成 Koin 的创建、启动与停止Composable fun App() { KoinApplication(configuration koinConfiguration { modules(appModule) }) { MyScreen() } }优势无需外部初始化不需要 Application 类Android 上自动注入androidContext与androidLogger依据组合生命周期自动 start/stopAndroid 上自动处理配置变更。适用场景希望以最简方式接入、且不需要太多控制的场景。注意KoinMultiplatformApplication已弃用请改用KoinApplicationkoinConfiguration。源码层面的工作原理KoinApplication(configuration: KoinConfiguration, logLevel: Level, content)的实现位于 projects/compose/koin-compose/src/commonMain/kotlin/org/koin/compose/KoinApplication.kt先调用rememberKoinMPApplication(configuration, logLevel)创建 Koin 实例再通过CompositionLocalProvider把 Koin 与根 Scope 包装进LocalKoinApplicationContext和LocalKoinScopeContext两个 CompositionLocal供整棵组合树读取。其中rememberKoinMPApplicationRememberKoinApplication.kt会先调用平台 expect 函数composeMultiplatformConfiguration合并平台配置再交由CompositionKoinApplicationLoader处理。Android 上的实际实现KoinApplication.android.kt会自动补充koinConfiguration { androidContext(appContext) // 从 LocalContext 获取 applicationContext androidLogger(loggerLevel) includes(config) }CompositionKoinApplicationLoaderCompositionKoinApplicationLoader.kt实现了RememberObserver接口组合进入时若发现全局尚无 Koin 上下文则执行startKoin(koinApplication)组合被onAbandoned时停止 Koin 上下文onForgotten时仅释放引用而不提前 stop。这就是“由 Compose 托管 Koin 生命周期”的底层机制。此外KoinApplicationPreview同样在 KoinApplication.kt为 Android Studio Preview 提供了轻量级本地 Koin 上下文避免在预览中与全局上下文冲突。示例工程 examples/sample-android-compose/src/main/java/org/koin/sample/androidx/compose/App.kt 中有KoinApplicationPreview(application { modules(appModule) }) { ... }配合Preview的完整用法。基础注入koinInject 与 koinViewModelkoinInject() —— 获取任意依赖在任意 Composable 中注入 Koin 管理的依赖Composable fun UserScreen() { val repository koinInjectUserRepository() // Use repository... }最佳实践—— 作为默认参数注入使 Composable 在不依赖 Koin 的情况下也能测试Composable fun UserScreen( repository: UserRepository koinInject() ) { // Testable without Koin }koinInject 的 remember 机制koinInject的三个重载均定义在 projects/compose/koin-compose/src/commonMain/kotlin/org/koin/compose/Inject.kt无参数版本remember(qualifier, scope) { scope.get(T::class, qualifier) }实例在重组合recomposition期间被记住ParametersDefinition版本lambda 形式会先把参数展开为ParametersHolder再以remember(qualifier, scope, p)缓存参数变化会触发重新解析ParametersHolder版本parametersOf()直传同样被remember缓存官方注释明确建议在频繁重组合时优先使用这一形式以提升性能。默认 scope 来自currentKoinScope()即LocalKoinScopeContext提供的当前组合作用域见 KoinApplication.kt。当 Scope 已关闭时底层ComposeContextWrapperComposeContextWrapper.kt会自动回退到默认根上下文从而优雅应对配置变更等场景。koinViewModel() —— 获取 ViewModel注入带完整生命周期管理的 ViewModelComposable fun UserScreen() { val viewModel koinViewModelUserViewModel() val state by viewModel.state.collectAsState() }多平台版本的koinViewModel实现在 projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/ViewModel.kt签名完整支持qualifier、viewModelStoreOwner默认取LocalViewModelStoreOwner.current、key、extras、scope与parameters最终委托给org.koin.viewmodel.resolveViewModel完成解析。Android 版实现koin-androidx-compose 的 ViewModel.kt与之等价行为一致。带参数的注入传递运行时参数Composable fun DetailScreen(itemId: String) { val viewModel koinViewModelDetailViewModel { parametersOf(itemId) } }当 Composable 频繁重组合时建议使用显式parameters形式以获得更好性能参数只求值一次并被 remember不会在每次重组合时重新展开 lambdaComposable fun DetailScreen(itemId: String) { val viewModel koinViewModelDetailViewModel( parameters parametersOf(itemId) ) }同样的性能考量也适用于koinInject详见 docs/reference/koin-compose/compose-lifecycle.md 中“Performance with Parameters”一节。示例工程 examples/sample-android-compose/.../App.kt 展示了koinViewModel(parameters { parametersOf(parentStatus) })与koinInject(parametersHolder parametersOf(stable_status))两种实战用法。定义模块三种 DSL 风格Compiler Plugin DSL编译期自动装配val appModule module { singleUserRepository() viewModelUserViewModel() }该 DSL 需要启用 Koin Compiler Plugin见 docs/setup/compiler-plugin.md由编译器在编译期完成依赖解析语法最简洁。Annotations注解 KSPSingleton class UserRepository KoinViewModel class UserViewModel( private val repository: UserRepository ) : ViewModel()注解方式由 Koin AnnotationsKSP 编译器在编译期生成模块与装配代码配合Module、ComponentScan、Configuration可实现自动模块发现。完整的 Compose Multiplatform 注解示例见 docs/quickstart/compose-multiplatform-annotations.md。Classic DSL经典手动装配val appModule module { singleOf(::UserRepository) viewModelOf(::UserViewModel) }经典 DSL 通过构造器引用singleOf/viewModelOf声明定义无需编译插件即可运行。示例工程 examples/sample-android-compose/.../di/appModule.kt 正是这种风格并包含factoryOf(::MyFactory)、scopeMyFactory { ... }等更多定义形式。动态模块rememberKoinModules在 Composable 进入组合时按需加载模块离开组合时按配置卸载适用于特性模块、懒加载与按需依赖val featureModule module { factoryFeatureRepository() viewModelFeatureViewModel() } Composable fun FeatureScreen() { // 进入组合时加载模块 rememberKoinModules(featureModule) val viewModel koinViewModelFeatureViewModel() }rememberKoinModulesprojects/compose/koin-compose/src/commonMain/kotlin/org/koin/compose/module/RememberModules.kt内部使用CompositionKoinModuleLoaderCompositionKoinModuleLoader.kt在remember中完成koin.loadModules(modules)当unloadOnForgotten/unloadOnAbandoned开启时组合退出或失败会调用koin.unloadModules(modules)卸载模块防止内存泄漏。模块可以一次传入多个也可以与lazyModule、导航NavHost 目的地内加载组合使用。详细用法与卸载选项见 docs/reference/koin-compose/compose-modules.md。作用域KoinScope 与相关 APIKoinScope创建绑定 Composable 生命周期的 Koin 作用域离开组合时自动关闭KoinScope(scopeOfFeatureScope()) { // 所有子组合均可访问 scoped 依赖 FeatureContent() }其底层实现projects/compose/koin-compose/src/commonMain/kotlin/org/koin/compose/scope/KoinScope.kt提供三种重载按Koin.() - Scopelambda、按ScopeID、按ScopeID Qualifier创建作用域并统一通过OnKoinScope将 scope 注入LocalKoinScopeContext且以rememberKoinScope管理生命周期。UnboundKoinScopeUnboundKoinScope.kt则不绑定组合生命周期直接把已存在的 Scope 提供给子组合——它被标注为 Delicate APIScope 需要外部手动关闭适用于由外部系统管理、或跨多棵组合树共享的 Scope。此外还有面向 Android 的KoinActivityScope/KoinFragmentScopekoin-androidx-compose 的 KoinAndroidScope.kt、Activity 级注入koinActivityInjectKoinActivityInject.kt以及导航级KoinNavigationScope要求koin-compose-viewmodel-navigation。各作用域 API 的对比与最佳实践见 docs/reference/koin-compose/compose-scopes.md。快速参考表函数用途koinInjectT()注入任意依赖koinViewModelT()注入 ViewModelkoinNavViewModelT()携带 Navigation 参数的 ViewModel注意新版建议直接用koinViewModelkoinNavViewModel已标记弃用见 NavViewModel.ktkoinActivityViewModelT()Activity 作用域的 ViewModelAndroid见 ViewModelExt.ktrememberKoinModules()随组合加载模块KoinScope {}创建作用域上下文示例工程对照仓库提供了可直接对照学习的完整示例examples/sample-android-composeAndroid Jetpack Compose 全功能示例覆盖startKoin启动、koinViewModel/koinInject/ 参数注入、KoinApplicationPreview、rememberKoinModules、KoinScope、KoinActivityScope、Type-Safe 导航与 String 导航并在MainActivity中演示了隔离上下文assert(getKoin().getOrNullSDKData() null)examples/sample-desktop-composeCompose Desktop 示例展示KoinApplication(application { modules(mod); printLogger(Level.DEBUG) })与koinInject的桌面端用法Main.kt。相关文档导航主题说明ViewModel全部 ViewModel 注入 API生命周期与状态重组合、状态、副作用与稳定性动态模块rememberKoinModules、懒加载作用域KoinScope、KoinNavigationScope、UnboundKoinScope测试Preview、单元测试隔离上下文SDK 隔离Navigation 3类型安全导航多平台核心 ViewModelViewModel 声明 DSLAndroid ViewModelAndroid 专属特性KMP 配置多平台工程配置快速上手Android Compose10 分钟完成一个 Compose Koin 应用【免费下载链接】koinKoin - a pragmatic lightweight dependency injection framework for Kotlin Kotlin Multiplatform项目地址: https://gitcode.com/gh_mirrors/ko/koin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表