为什么(不是?)将上下文传递给 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 然后您甚至不需要工厂,因为默认的隐式工厂已经可以处理它。