在使用ViewModel时,我们有两种常见的依赖注入方式:
class MyViewModelFactory(private val myRepository: MyRepository): ViewModelProvider.Factory {
override fun create(modelClass: Class): T {
return if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
MyViewModel(myRepository) as T
} else {
throw IllegalArgumentException("ViewModel Not Found")
}
}
}
class MyFragment : Fragment() {
private val myViewModel: MyViewModel by viewModels { MyViewModelFactory(MyRepositoryImpl()) }
// ...
}
@HiltViewModel
class MyViewModel @Inject constructor(
private val myRepository: MyRepository
) : ViewModel() {
//...
}
class MyFragment : Fragment(R.layout.fragment_my) {
private val myViewModel: MyViewModel by viewModels()
//...
}
在使用Hilt后,我们不再需要MyViewModelFactory类。我们只需要在我们要使用该类的Activity或Fragment中添加@AndroidEntryPoint注解,然后使用viewModels()方法来获取MyViewModel的实例即可。
@AndroidEntryPoint
class MyFragment : Fragment(R.layout.fragment_my) {
private val myViewModel: MyViewModel by viewModels()
//...
}
这种方式要比第一种方式更为简洁。在升级App的版本时,这种方式也更加方便。
上一篇:byviewmodel()、viewmode()和ViewModelProvider有什么区别?
下一篇:Byzantinefaulttolerance和PracticalByzantinefaulttolerance有什么区别?