AndroidViewModel создается без передачи контекста приложения? - PullRequest
0 голосов
/ 03 марта 2020

Я сейчас копаюсь в образце приложения Android Room with a View, полный исходный код доступен здесь . В этом проекте определен WordViewModel типа AndroidViewModel:

class WordViewModel(application: Application) : AndroidViewModel(application)

Обратите внимание, как конструктору требуется передать экземпляр Application. Но когда я проверяю MainActivity, WordViewModel извлекается без передачи в экземпляр Application:

// Get a new or existing ViewModel from the ViewModelProvider.
mWordViewModel = new ViewModelProvider(this).get(WordViewModel.class);

Как это возможно, как можно получить WordViewModel без передачи в экземпляре Application и без использования собственной фабрики?

Ответы [ 2 ]

1 голос
/ 04 марта 2020

В AndroidX-Activity 1.2.0 ComponentActivity (и, следовательно, AppCompatActivity) реализован HasDefaultViewModelProviderFactory, который по умолчанию возвращает ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication()) из вашей деятельности / фрагмента, что позволяет вам получить приложение из этого AndroidViewModelFactory без вам нужно явно передать его.

Затем эта фабрика создает экземпляр вашей ViewModel с помощью отражения с помощью конструктора __(application).

Как правило, лучше использовать SavedStateViewModelFactory, чтобы иметь возможность чтобы получить SavedStateHandle аналогичным образом (___(application, savedStateHandle)), хотя.

0 голосов
/ 20 апреля 2020

Зависимости

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"

Класс приложения

class App : Application() {
    //Code
}

Класс AndroidViewModel

class TestVM (app : android.app.Application) : AndroidViewModel(app){
    // Cast app to the application class
    val myApplication : App = app as App
}

Во фрагменте

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val viewModel = ViewModelProvider(this).get(TestVM::class.java)
}
...