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

在Jetpack Compose中如何向ViewModel传递String参数?

在Jetpack Compose中向ViewModel传递动态String参数

官方代码实验室中的ViewModel工厂是静态不可变的,只能注入从Application获取的固定依赖,无法直接传入动态参数。要实现传递String这类动态变量,需要将工厂从固定的val改为接收参数的函数,具体改造步骤如下:

1. 定义带参数的ViewModel

首先确保你的ViewModel类接收String参数:

class LoadingScreenViewModel(private val myString: String) : ViewModel() {
    // 可在ViewModel内使用myString进行业务逻辑处理
}

2. 改造ViewModel的工厂实现

将伴生对象中的固定工厂改为函数,让它接收需要传递的String参数,再返回对应的Factory:

companion object {
    fun provideFactory(myString: String): ViewModelProvider.Factory = viewModelFactory {
        initializer {
            LoadingScreenViewModel(myString)
        }
    }
}

3. 在Compose中使用工厂传递参数

在Compose界面中,传入动态生成的String参数调用工厂函数,再将其传给viewModel()方法:

@Composable
fun LoadingScreen() {
    // 这里的字符串可以是动态来源,比如路由参数、用户输入、API返回值等
    val dynamicInputString = "这是要传递的动态字符串"
    
    val viewModel: LoadingScreenViewModel = viewModel(
        factory = LoadingScreenViewModel.provideFactory(dynamicInputString)
    )
    
    // 后续的Compose UI逻辑
}

扩展:传递自定义对象

如果后续需要传递自定义对象,逻辑完全一致,只需修改工厂函数的参数类型:

// 自定义对象示例
data class UserInfo(val id: String, val name: String)

// ViewModel接收自定义对象
class LoadingScreenViewModel(private val userInfo: UserInfo) : ViewModel() { }

// 改造后的工厂函数
companion object {
    fun provideFactory(userInfo: UserInfo): ViewModelProvider.Factory = viewModelFactory {
        initializer {
            LoadingScreenViewModel(userInfo)
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:44:57