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

Jetpack Compose中如何向AndroidViewModel传递Int类型id参数

Jetpack Compose 向AndroidViewModel传递Int类型参数的实现方案

你自定义的RecallViewModel比原生AndroidViewModel多了一个Int类型的id构造参数,默认的ViewModel实例化逻辑无法识别这个参数,所以需要自定义ViewModelProvider.Factory来声明实例化规则,具体实现步骤如下:

1. 自定义ViewModel工厂类

import android.app.Application
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider

class RecallViewModelFactory(
    private val id: Int,
    private val application: Application
) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(RecallViewModel::class.java)) {
            @Suppress("UNCHECKED_CAST")
            return RecallViewModel(id, application) as T
        }
        throw IllegalArgumentException("未知的ViewModel类型")
    }
}

2. 在Compose页面中传入参数生成ViewModel实例

调用Compose提供的viewModel()方法时,把你自定义的工厂实例传入factory参数即可:

import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
import androidx.lifecycle.viewmodel.compose.viewModel

@Composable
fun RecallScreen(
    id: Int,
    recallViewModel: RecallViewModel = viewModel(
        factory = RecallViewModelFactory(
            id = id,
            application = LocalContext.current.applicationContext as Application
        )
    )
) {
    // 此处可直接使用recallViewModel执行业务逻辑
    Text("当前页面收到的id为: $id")
}

注意事项

  • 必须使用LocalContext.current.applicationContext转成Application实例传入工厂,禁止直接传入Activity上下文避免内存泄漏
  • 如果你项目中集成了Hilt依赖注入框架,也可以通过@Assisted注解直接注入参数,无需手动编写工厂类,上述是无第三方依赖的原生实现方案
  • 该方案同样适配其他自定义类型的参数传递,仅需修改工厂类的构造参数即可

内容的提问来源于stack exchange,提问作者Omar Khaled

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:30:02