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

