我在Android Studio项目中使用Hilt作为DI,viewModel()
将自动创建SoundViewModel
的实例。
代码A运行良好
我认为viewModel()
将创建一个SoundViewModel
的单例。
我认为mViewMode_A
将自动分配给mViewMode_B
,而无需在代码b中创建新实例。
我认为mViewMode_A
和mViewMode_B
都指向代码b中的同一个实例。
但是我不知道为什么我运行代码B时得到的是结果B,你能告诉我吗?
结果B
java.lang.RuntimeException: Cannot create an instance of class info.dodata.soundmeter.presentation.viewmodel.SoundViewModel
代码
@Composable
fun NavGraph(
mViewModel_A: SoundViewModel = viewModel()
) {
ScreenHome(mViewMode_B = mViewMode1_A)
}
@Composable
fun ScreenHome(
mViewModel_B: SoundViewModel
) {
...
}
@HiltViewModel
class SoundViewModel @Inject constructor(
@ApplicationContext private val appContext: Context,
...
): ViewModel() {
...
}
代码B
@Composable
fun NavGraph(
mViewMode_A: SoundViewModel = viewModel()
) {
ScreenHome()
}
@Composable
fun ScreenHome(
mViewMode_B: SoundViewModel = viewModel() // I think mViewMode_A will be assigned to mViewMode_B automatically without creating a new instnace.
) {
...
}
//The same
您需要在ViewModel初始化中传递键
我不擅长组合,但这将解决你的问题
为创建ViewModel的新实例,我们需要设置Key属性
ViewModelProvider(requireActivity()).get(<UniqueKey>, SoundViewModel::class.java)
key -用来标识ViewModel的键。
val mViewMode_A = viewModel<SoundViewModel>(key = "NavGraph")
val mViewMode_B = viewModel<SoundViewModel>(key = "ScreenHome")
对于Composable,此链接可以帮助您分离viewmodel