Melihat pada Google docs untuk ViewModel
, mereka menunjukkan kode contoh di bawah ini tentang cara mendapatkan ViewModel
:
val model = ViewModelProviders.of(this).get(MyViewModel::class.java)
Saat menggunakan dependensi terbaru android.arch.lifecycle:extensions:1.1.1
tidak ada kelas seperti itu ViewModelProviders
.
Pergi ke dokumentasi untuk ViewModelProviders
, saya melihat komentar yang mengatakan:
Kelas ini sudah tidak digunakan lagi di API level 1.1.0. Gunakan ViewModelProvider.AndroidViewModelFactory
Masalahnya adalah, ketika mencoba menggunakan ViewModelProvider.AndroidViewModelFactory
, tidak dapat menemukan of
metode yang setara untuk mendapatkan contoh dari ViewModel
.
Apa yang saya coba lakukan:
ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java)
Karena itulah nama metode create
, saya mendapatkan contoh baru dari ViewModel setiap kali saya menyebutnya, yang bukan apa yang saya cari.
Adakah yang dimaksud dengan penggantian kode usang di atas?
Jawaban:
UPDATE 2020-06-16 : Saat
ViewModelProviders
ini sudah usang dan seharusnya tidak lagi digunakan. Pertanyaan dan jawaban ini berasal dari akhir 2018, padahal bukan itu masalahnya. Pertanyaan dan jawaban ini juga untuk edisi Komponen Arsitektur yang lebih lamaViewModelProviders
, bukan edisi AndroidX.Ya ada. Untuk menunjukkan ini:
Buat proyek baru di Android Studio 3.2.1 (dengan
minSdkVersion
template Kotlin, 21, "aktivitas kosong")Tambahkan
android.arch.lifecycle:extensions:1.1.1
ke dependensiapp
modulIni akan memberi Anda
app/build.gradle
suka:Anda kemudian akan melihat perpustakaan itu muncul di "Perpustakaan Eksternal" dengan kelas itu:
Dan Anda akan dapat merujuk kelas itu:
Komentar itu ada di bawah
ViewModelProviders.DefaultFactory
entri kelas dan merujuk ke kelas itu, bukanViewModelProviders
:Gunakan
ViewModelProviders
.sumber
ViewModelProviders.of()
tidak ada lagi.Saya menggunakan
2.2.0
versi siklus hidup :Itu harus bekerja, menggunakan
ViewModelProvider
konstruktor.Pembaruan 2020/5/15
Saya menemukan cara elegan lain untuk mencapai, Android KTX dapat membantu
Ref: https://developer.android.com/reference/kotlin/androidx/fragment/app/package-summary#viewmodels
2020/06/25: mengoreksi kasus delegasi
sumber
YourViewModel viewModel = new ViewModelProvider(this).get(YourViewModel.class);
TextView
atauEditText
memperkenalkan Komponen baru.Seperti @FantasyFang disebutkan dalam jawabannya, gunakan versi terbaru untuk
lifecycle:lifecycle-extensions
saat ini2.2.0-alpha03
. Jadi, Anda harus menambahkan file build.gradle pada baris berikut:Bagi mereka yang menggunakan Java, untuk menyelesaikan ini, kirimkan argumen tersebut langsung ke konstruktor ViewModelProvider :
Atau jika Anda tidak menggunakan pabrik, cukup gunakan:
Tanpa melewati objek pabrik Anda.
sumber
Pada 2.2.0. ekstensi siklus hidup telah ditinggalkan. Rujuk ke Dokumentasi Google .
Ini adalah potongan dari halaman:
Perpustakaan baru adalah:
Kode baru untuk JAWA:
Atau untuk Kotlin:
sumber
Tidak digunakan lagi:
ViewModelProviders.of(this, provider).get(VM::class.java)
Untuk:
ViewModelProvider(this, provider).get(VM::class.java)
sumber
Awal tahun 2020, Google telah mencabut kelas ViewModelProviders , dalam versi 2.2.0 dari perpustakaan siklus hidup androidx.
Tidak perlu lagi menggunakan ViewModelProviders untuk membuat instance dari ViewModel, Anda bisa meneruskan instance Fragment atau Activity Anda ke konstruktor ViewModelProvider sebagai gantinya.
Jika Anda menggunakan kode seperti:
Anda akan mendapat peringatan itu ViewModelProviders telah ditinggalkan.
Untuk menghindari penggunaan perpustakaan yang sudah tidak digunakan lagi, buat perubahan berikut:
Dalam file build.gradle (Module: app), gunakan versi 2.2.0 dari komponen siklus hidup:
Jika Anda ingin menggunakan ViewModel sebagai gantinya, gunakan
fragment-ktx secara otomatis menyertakan activity-ktx, jadi Anda tidak perlu menentukan keduanya dalam dependensi.
Anda perlu menentukan Java 8 di bagian android:
Di Fragmen atau Aktivitas Anda, ubah impor ke:
impor androidx.activity.viewModels
Kode untuk membuat ViewModel kemudian menjadi:
dari pada
Gunakan objek viewModel sebagai:
di mana newNumer adalah objek LiveData
Dalam Fragmen yang ingin Anda bagikan dengan ViewModel Kegiatan, Anda akan menggunakannya
Itu sama dengan melewatkan instance Activity dalam fungsi (usang)
ViewModelProviders.of()
.sumber
ViewModelProviders.of () telah ditinggalkan.
Gunakan konstruktor ViewModelProvider secara langsung karena mereka sekarang menangani peran ViewModelProvider.Factory default.
sumber
Ya @ Tarek, sudah usang. Gunakan sekarang dengan AndroidX:
sumber
ViewModelProvider(viewModelStoreOwner, factory).get(YourVideoModel::class.java)
sebaliknya AndaonCleared()
tidak akan bekerja dengan benar, dan ViewModel tidak akan disimpan di perubahan konfigurasi. Jangan gunakan jawaban ini.Mungkin Anda bisa menggunakan:
tanpa perlu menambahkan
android.arch.lifecycle:extensions:1.1.1
ketergantungan.sumber
Gunakan ViewModelProvider secara langsung alih-alih pengguna ViewModelProviders.of () seperti yang disebutkan dalam dokumen.
https://developer.android.com/reference/androidx/lifecycle/ViewModelProviders
sumber
Saya menggunakan
android X
dan juga memiliki masalah ini.Pertama-tama , Anda harus menambahkan dependensi ini ke
Gradle
:Dalam kasus saya, $ lifecycle_version adalah
2.2.0-rc02
Kedua: Impor untuk
ViewModelProvider
harus:Daripada Anda dapat menginisialisasi vIewModel Anda seperti contoh di bawah ini:
sumber
androidx.lifecycle:lifecycle-compiler
sudah usang olehandroidx.lifecycle:lifecycle-common-java8
.Sebenarnya, apa yang dilakukan
ViewModelProviders.of()
metode di bawah tenda?Dibutuhkan
Fragment
sebagai argumen, membuatViewModelProvider
objek dan meneruskan fragmen langsung keViewModelProvider
konstruktor.Kita juga bisa menggunakan cara yang sama.
Misalnya sebelum:
Setelah:
sumber
ViewModelProvider
memiliki konstruktor yang mengharapkan aViewModelStoreOwner
dan aFactory
.Jika Anda menggunakan Kotlin, Anda dapat menggunakan delegasi properti
viewModels()
seperti ini:Sumber: https://forums.bignerdranch.com/t/solution-to-deprecated-method-viewmodelproviders-of/16833
sumber
Saya bukan ahli tetapi saya memiliki garis kode yang memecahkan masalah saya di Jawa. Semoga ini bisa membantu seseorang.
Seperti yang saya katakan saya ingin memberikan lebih banyak detail, tetapi ini memperbaiki masalah ini untuk saya.
sumber
onCleared()
tidak akan dipanggil dengan cara ini dan ViewModel Anda akan dibuat ulang setiap kali (tidak disimpan untuk perubahan konfigurasi).viewModel = new ViewModelProvider(this).get(MyViewModel.class)
. Jika AndaAndroidViewModel
tidak mendapatkanApplication
, maka Anda memiliki ketidakcocokan versi antara Siklus Hidup dan Aktivitas / Fragmen.new ViewModelProvider.AndroidViewModelFactory(
bukannew ViewModelProvider(
.Gunakan ini:
sumber
Anda dapat menggunakan ini sebagai gantinya:
"this" di dalam tanda kurung adalah pemilik instance YourViewModel.
sumber
Jawaban ini untuk Java tetapi Anda bisa mengerti poin utama. Solusi adalah bahwa Anda perlu menggunakan ViewModelProvider karena ViewModelProviders sudah usang :
Contoh penggunaan adalah:
Juga, jangan lupa perbarui Dependensi Gradle : Periksa di sini untuk versi terakhirnya
!!! Namun, berhati-hatilah karena beberapa jawaban merekomendasikan solusi ini tetapi tidak berhasil untuk saya:
Karena ketika saya menggunakan cara ini, saya mendapat di bawah Pesan Kesalahan:
@canerkaseler
sumber
create
, makaonCleared()
tidak akan berfungsi dengan benar.androidx.core
danandroidx.lifecycle
dependensi Anda .Ketika Anda menggunakan belati maka Anda akan melewati pabrik di konstruktor
sumber
Jika Anda memiliki implementasi ini
Coba gunakan
viewModel = MainViewModel()
sumber
Coba ini...
sumber
seharusnya bekerja seperti ini
sumber