You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 10:28:24