为什么(不是?)将上下文传递给 Android ViewModelFactory
Why (Not?) Pass Context to Android ViewModelFactory
我正在重构将“应用程序上下文”传递给视图模型工厂并在视图模型中访问的应用程序。如果这种编码实践是好/坏/或好,是否有明确的意见?例如,我用它来调用从资产目录加载数据文件的数据存储库。如果有“更好的做法”,它记录在哪里?
代码片段
class MainViewModelFactory(private val applicationContext: Context) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MainViewModel::class.java)) {
return MainViewModel(applicationContext) as T
.....
class MainViewModel(
applicationContext: Context
) : ViewModel() {....
init {
_dataIsLoaded.value = dataRepository.myFunction(applicationContext, Constants.data_file_name)
只要您存储在 ViewModel 属性 中的上下文确实是应用程序上下文,而不是某些 Activity 实例,就可以了。您可以通过对其调用 applcationContext
并将其传递给工厂中的 ViewModel 构造函数来确保这一点。
如果应用程序上下文是您唯一的 ViewModel 构造函数参数,您应该子类化 AndroidViewModel 然后您甚至不需要工厂,因为默认的隐式工厂已经可以处理它。
我正在重构将“应用程序上下文”传递给视图模型工厂并在视图模型中访问的应用程序。如果这种编码实践是好/坏/或好,是否有明确的意见?例如,我用它来调用从资产目录加载数据文件的数据存储库。如果有“更好的做法”,它记录在哪里?
代码片段
class MainViewModelFactory(private val applicationContext: Context) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MainViewModel::class.java)) {
return MainViewModel(applicationContext) as T
.....
class MainViewModel(
applicationContext: Context
) : ViewModel() {....
init {
_dataIsLoaded.value = dataRepository.myFunction(applicationContext, Constants.data_file_name)
只要您存储在 ViewModel 属性 中的上下文确实是应用程序上下文,而不是某些 Activity 实例,就可以了。您可以通过对其调用 applcationContext
并将其传递给工厂中的 ViewModel 构造函数来确保这一点。
如果应用程序上下文是您唯一的 ViewModel 构造函数参数,您应该子类化 AndroidViewModel 然后您甚至不需要工厂,因为默认的隐式工厂已经可以处理它。