如何在Kotlin Desktop中加载基于Moko MVVM的ViewModel?
跨平台JetBrains Compose中加载moko-mvvm ViewModel的解决方案
核心方案:使用moko-mvvm的Compose扩展函数
moko-mvvm库本身提供了跨平台的Compose ViewModel绑定能力,无需为Android和Desktop分别实现逻辑,只需添加对应依赖后使用库内置的扩展函数即可。
1. 添加依赖
在项目构建文件中,针对不同模块配置以下依赖:
Common模块(build.gradle.kts)
commonMain.dependencies { implementation("dev.icerock.moko:mvvm-compose:0.16.1") // 建议使用最新版本 implementation("dev.icerock.moko:mvvm-core:0.16.1") }
Android模块(build.gradle.kts)
Android端需保留AndroidX生命周期依赖以集成原生ViewModel机制:
androidMain.dependencies { implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2") }
Desktop模块(build.gradle.kts)
Desktop端无需额外生命周期依赖,moko-mvvm会自行处理ViewModel生命周期:
jvmMain.dependencies { // 仅需继承common模块的moko-mvvm相关依赖 }
2. 在Composable中加载ViewModel
在MyScreen Composable中直接调用viewModel()函数即可获取ViewModel实例,该函数自动适配Android和Desktop的生命周期规则:
import dev.icerock.moko.mvvm.compose.viewModel @Composable fun MyScreen() { val viewModel: MyIpViewModel = viewModel() Column { // 此处使用viewModel的数据与业务逻辑 } }
3. 自定义ViewModel构造参数(可选)
如果ViewModel需要自定义构造参数(如传入Repository),可通过viewModel()的工厂参数实现:
// 示例:带自定义参数的ViewModel class MyIpViewModel(private val ipRepository: IpRepository) : ViewModel() { // 业务逻辑代码 } @Composable fun MyScreen(ipRepository: IpRepository) { val viewModel: MyIpViewModel = viewModel { MyIpViewModel(ipRepository) } Column { // 界面内容 } }
原理说明
- Android端:moko-mvvm的
viewModel()会委托给AndroidX的ViewModelProvider,确保ViewModel遵循Android原生生命周期(如屏幕旋转时不重建)。 - Desktop端:moko-mvvm将ViewModel生命周期与Composable的
LocalViewModelStoreOwner绑定,保证ViewModel在Composable树中正确创建和销毁。
内容的提问来源于stack exchange,提问作者BArtWell
相关产品推荐
相关产品推荐

