为什么当我在 Android Studio 项目中使用 Hilt 作为 DI 时,我不能启动 viewModel() 两次?



我在Android Studio项目中使用Hilt作为DI,viewModel()将自动创建SoundViewModel的实例。

代码A运行良好

我认为viewModel()将创建一个SoundViewModel的单例。

我认为mViewMode_A将自动分配给mViewMode_B,而无需在代码b中创建新实例。

我认为mViewMode_AmViewMode_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

最新更新