使用ViewModel和ViewModel提供程序工厂传递应用程序上下文



这是我第一次使用MVVM,我想做对它。我有这个:

登录活动

class LoginActivity : AppCompatActivity() {
lateinit var viewModel: SettingsViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
val viewModelProviderFactory = SettingsViewModelProviderFactory()
viewModel = ViewModelProvider(this, viewModelProviderFactory).get(SettingsViewModel::class.java)
bottomLoginNavigationView.setupWithNavController(loginNavHostFragment.findNavController())
}
}

设置ViewModelFactory

class SettingsViewModelProviderFactory() : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return SettingsViewModel() as T
}
}

在我的SettingsViewModel中,我需要应用程序上下文。根据我搜索到的内容,我需要在构造函数中传递application:application,然后继承AndroidViewModel,如下所示:

class SettingsViewModel(application: Application): AndroidViewModel(application)
{
private val context = getApplication<Application>().applicationContext
}

如果我这样做,我会在SettingsViewModelProviderFactory中得到一个错误。我在...return SettingsViewModel() as T中得到了错误,因为我需要在SettingsViewModel(application:application(的参数中传递应用程序上下文。

在我的登录活动中,我添加了这个

val application = requireNotNull(this).application
val viewModelProviderFactory = SettingsViewModelProviderFactory(application)
viewModel = ....

然后在我的设置ViewModelProviderFactory中,我添加了这个

class SettingsViewModelProviderFactory(
private val application: Application
) : ViewModelProvider.Factory {...}

最新更新