ViewModelProvider.get всегда дает неразрешенную ссылку

#android #kotlin #viewmodel #android-livedata #android-lifecycle

#Android #kotlin #viewmodel #android-livedata #android-жизненный цикл

Вопрос:

Я пытаюсь использовать библиотеку ViewModel в своем приложении, я создал класс MainActivityViewModel , который расширяет класс ViewModel. При попытке создать экземпляр MainActivityViewModel класса внутри MainActivity с помощью ViewModelProvider.get(Class) метода get всегда получается неразрешенная ссылка

MainActivityViewModel класс:

 class MainActivityViewModel: ViewModel() {
    private lateinit var mWords: MutableLiveData<List<Word>>

    fun getWords(): LiveData<List<Word>>{
        return mWords
    }
}
 

MainActivity класс:

 class MainActivity : AppCompatActivity() {

private lateinit var mMainActivityViewModel: MainActivityViewModel
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val recycler = findViewById<RecyclerView>(R.id.recycler)
    recycler.adapter = RecyclerAdapter(this)
    recycler.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)

    mMainActivityViewModel = ViewModelProvider.get(MainActivityViewModel::class.java)
}
 

}
Я не уверен, что я здесь делаю не так,

зависимости, используемые для LiveData:

 def lifecycle_version = "2.2.0"
def arch_version = "2.1.0"
implementation 'androidx.core:core-ktx:1.3.2'
implementation "androidx.fragment:fragment-ktx:1.2.5"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
// Lifecycles only (without ViewModel or LiveData)
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
 

Заранее спасибо

Комментарии:

1. Это не статический / сопутствующий метод объекта

2. @Selvin не могли бы вы подробнее рассказать, пожалуйста?

3. О чем? Вам нужен экземпляр этого класса

Ответ №1:

Вам нужно передать контекст, чтобы ViewModel знал, когда его можно удалить.

 mMainActivityViewModel = ViewModelProvider(this).get(MainActivityViewModel::class.java)
 

Ответ №2:

Вам необходимо передать владельца для поставщика viewmodel (Activity / fragment)

 mMainActivityViewModel= ViewModelProvider(this).get(MainActivityViewModel::class.java)
 

В качестве альтернативы вы можете объявить это следующим образом

 import androidx.fragment.app.viewModels  //use this import

val mMainActivityViewModel: MainActivityViewModel by viewModels() // no need to initialize it again