I am currently digging through the Android Room with a View
sample app, full source code available here. In this project, an WordViewModel of type Android
Dependencies
def lifecycle_version = "2.2.0"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
kapt "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
implementation "androidx.fragment:fragment-ktx:1.2.4"
Application Class
class App : Application() {
//Code
}
AndroidViewModel Class
class TestVM (app : android.app.Application) : AndroidViewModel(app){
// Cast app to the application class
val myApplication : App = app as App
}
In Fragment
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val viewModel = ViewModelProvider(this).get(TestVM::class.java)
}
AndroidX-Activity 1.2.0's ComponentActivity
(and therefore AppCompatActivity
) implements HasDefaultViewModelProviderFactory
, which returns an ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication())
from your Activity/Fragment by default, allowing you to get the application from this AndroidViewModelFactory
without you having to explicitly pass it.
Then, this factory instantiates your ViewModel via reflection using a __(application)
constructor.
It's generally a better idea to use SavedStateViewModelFactory
in order to be able to receive a SavedStateHandle
in a similar manner (___(application, savedStateHandle)
) though.
So to fix the problem, you need to add up-to-date versions of core-ktx
, activity-ktx
and fragment-ktx
explicitly in your code.