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
相关产品推荐
相关产品推荐

