Apakah ada cara untuk meneruskan argumen tambahan ke AndroidViewModel
konstruktor kustom saya kecuali konteks Aplikasi. Contoh:
public class MyViewModel extends AndroidViewModel {
private final LiveData<List<MyObject>> myObjectList;
private AppDatabase appDatabase;
public MyViewModel(Application application, String param) {
super(application);
appDatabase = AppDatabase.getDatabase(this.getApplication());
myObjectList = appDatabase.myOjectModel().getMyObjectByParam(param);
}
}
Dan ketika saya ingin ViewModel
menggunakan kelas khusus saya, saya menggunakan kode ini di fragmen saya:
MyViewModel myViewModel = ViewModelProvider.of(this).get(MyViewModel.class)
Jadi saya tidak tahu bagaimana String param
memasukkan argumen tambahan ke dalam kebiasaan saya ViewModel
. Saya hanya bisa melewatkan konteks Aplikasi, tetapi tidak argumen tambahan. Saya sangat menghargai setiap bantuan. Terima kasih.
Edit: Saya telah menambahkan beberapa kode. Saya harap sekarang lebih baik.
android
mvvm
viewmodel
android-components
Mario Rudman
sumber
sumber
Jawaban:
Anda harus memiliki kelas pabrik untuk ViewModel Anda.
Dan saat membuat instance model tampilan, Anda melakukan seperti ini:
Untuk kotlin, Anda dapat menggunakan properti yang didelegasikan:
Ada juga opsi baru lainnya - untuk mengimplementasikan
HasDefaultViewModelProviderFactory
dan menggantigetDefaultViewModelProviderFactory()
dengan instantiation pabrik Anda dan kemudian Anda akan memanggilViewModelProvider(this)
atauby viewModels()
tanpa pabrik.sumber
ViewModel
kelas membutuhkan ViewModelFactory?ViewModel
bisa / akan memiliki DI yang berbeda. Bagaimana Anda tahu instance mana yang mengembalikancreate()
metode?ViewModel
Metode pencegahan kreasi baruget()
. Berdasarkan dokumentasi: "Mengembalikan ViewModel yang ada atau membuat yang baru dalam cakupan (biasanya, fragmen atau aktivitas), yang terkait dengan ViewModelProvider ini." lihat: developer.android.com/reference/android/arch/lifecycle/…return modelClass.cast(new MyViewModel(mApplication, mParam))
untuk menghilangkan peringatanTerapkan dengan Injeksi Ketergantungan
Ini lebih maju dan lebih baik untuk kode produksi.
Dagger2 , Square's AssistedInject menawarkan implementasi siap produksi untuk ViewModels yang dapat memasukkan komponen yang diperlukan seperti repositori yang menangani permintaan jaringan dan database. Ini juga memungkinkan injeksi manual argumen / parameter dalam aktivitas / fragmen. Berikut adalah garis besar singkat dari langkah - langkah untuk diimplementasikan dengan kode Gists berdasarkan posting rinci Gabor Varadi, Dagger Tips .
Dagger Hilt , adalah solusi generasi berikutnya, dalam alfa mulai 12/7/20, menawarkan kasus penggunaan yang sama dengan penyiapan yang lebih sederhana setelah pustaka dalam status rilis.
Implementasikan dengan Lifecycle 2.2.0 di Kotlin
Meneruskan Argumen / Parameter
Mengaktifkan SavedState dengan Arguments / Parameters
sumber
Untuk satu pabrik yang dibagi di antara beberapa model tampilan berbeda, saya akan memperluas jawaban mlyko seperti ini:
Dan membuat contoh model tampilan:
Dengan model tampilan berbeda memiliki konstruktor berbeda.
sumber
Berdasarkan @ vilpe89, solusi Kotlin di atas untuk kasus AndroidViewModel
}
Kemudian sebuah fragmen bisa memulai viewModel sebagai
Dan kemudian kelas ViewModel yang sebenarnya
Atau dalam beberapa metode yang sesuai ...
sumber
Saya menjadikannya kelas di mana objek yang sudah dibuat dilewatkan.
Lalu
sumber
Saya menulis pustaka yang seharusnya membuat melakukan ini lebih mudah dan lebih bersih, tidak perlu multibindings atau boilerplate pabrik, sambil bekerja dengan mulus dengan argumen ViewModel yang dapat disediakan sebagai dependensi oleh Dagger: https://github.com/radutopor/ViewModelFactory
Dalam tampilan:
sumber
(KOTLIN) Solusi saya menggunakan sedikit Refleksi.
Katakanlah Anda tidak ingin membuat kelas Pabrik yang tampak sama setiap kali Anda membuat kelas ViewModel baru yang memerlukan beberapa argumen. Anda dapat melakukannya melalui Refleksi.
Misalnya, Anda akan memiliki dua Aktivitas berbeda:
Dan ViewModels untuk Aktivitas tersebut:
Kemudian bagian ajaibnya, implementasi kelas Pabrik:
sumber
Mengapa tidak melakukannya seperti ini:
lalu gunakan seperti ini dalam dua langkah:
sumber
myViewModel.initialize(param)
dionCreate
aktivitas, misalnya, dapat disebut beberapa kali pada yang samaMyViewModel
misalnya sebagai pengguna berputar perangkat.Panggil Viewmodel di Activity
Untuk referensi lebih lanjut: Contoh Android MVVM Kotlin
sumber