Android'de bir Viewmodel'in kurucusu ne zaman çağrılır?

0

Soru

Şu kod etiketini inceliyorum: https://developer.android.com/codelabs/android-lifecycles#6 İşlem ölümünden kurtulmak için savedstatehandle'ı bir Viewmodel'de nasıl kullanacağınızı açıklar. ViewModel yapıcısı aşağıdaki gibidir:

    private SavedStateHandle mState;

    public SavedStateViewModel(SavedStateHandle savedStateHandle) {
       mState = savedStateHandle;
    }

Ve viewmodel Aktivitede aşağıdaki gibi başlatılır:

    mSavedStateViewModel = new ViewModelProvider(this).get(SavedStateViewModel.class);

Viewmodel'in yapıcısı ne zaman çağrılır? Ve Viewmodel nasıl elde edilir savedStateHandle ViewModel parametresi?

Düzenlemek:

Sorumun cevabını bu blog yazısı aracılığıyla buldum: https://www.rockandnull.com/viewmodel-savedstate/

Eğer yazıyor SavedStateHandle viewmodel yapıcımızdaki tek parametre by viewModels temsilci, viewmodel'e otomatik olarak sağlar.

Ancak, Bağımlılık enjeksiyon çerçevesi(Hılt) tarafından sağlanan özel parametrelerin bir kombinasyonuna sahipsek, örneğin: depo, birkaç diğer çalışma zamanı argümanı, örneğin: seçilen kategori kimliği ve SavedStateHandle viewmodel'in yapıcısındaki süreç ölümünden kurtulmamıza yardımcı olmak için-Tüm bu parametreleri fabrikaya nasıl sağlayabiliriz?

Lütfen anlayışım için küçük bir örnek gönderin

android android-lifecycle viewmodel
2021-11-24 03:13:47
1

En iyi cevabı

4

Takip ettiğiniz Kod Etiketi, bunun yerine belirli bir Kavramı anlamanızı sağlamaktır bütün kod . Şüphenizle ilgili olarak onlar tarafından hiçbir uygulama sağlanmaz, yani ViewModel parametrelerini nasıl alır ?


genel bakış : Viewmodel'in belirli bir iç uygulaması nedeniyle, bağımsız değişkenleri doğrudan Viewmodel'e iletemezsiniz, bunun yerine Viewmodel'e parametreleri sağlayan üçüncü bir sınıf oluşturmanız gerekir.


Şüphene cevap ver :

Bir viewmodel'in parametrelerini alabileceği iki yaklaşım vardır :

  1. Bağımlılık Dışı Enjeksiyon Yolu : Burada viewmodelprovider'ı genişleten bir sınıf oluşturursunuz.Fabrika. Kodunuzda, burada görebilirsiniz :
  mSavedStateViewModel = new ViewModelProvider(this).get(SavedStateViewModel.class);

Burada, hiçbir bağımsız değişkenin iletilmediği varsayılan bir sınıf oluşturulur .Bu, ihtiyaçları ifade etmek için kod etiketinde verilen eksik bir yol olan başlatma amacıyla yapılır . Bu makale ile aynı kavram hakkında iyi miktarda bilgi edinebilirsiniz :

https://medium.com/koderlabs/viewmodel-with-viewmodelprovider-factory-the-creator-of-viewmodel-8fabfec1aa4f

  1. Bağımlılık Enjeksiyon Yolu : Şimdi, DI framework Hilt'i biliyorsanız, viewmodelproviders'ı uygulamanın en basit yolu budur . Burada viewmodel'inize @ViewModelInject ile açıklama yapmanız yeterlidir ve işiniz bitti .Arka plandaki DI çerçevesi, bunu yapmak yerine bir ViewModelFactory oluşturacaktır .Bu, Hilt kullanarak Viewmodel'e nasıl parametre sağladığınıza ilişkin örnek bir koddur :

class SampleViewModel @ViewModelInject constructor(
                     @Assisted private val savedStateHandle: SavedStateHandle) : ViewModel() { }
2021-11-24 04:17:44

Uygulamayı codelab'dan hata ayıkladım. Herhangi bir fabrikayı geçmeme rağmen yapıcı çağrılıyor. Bu nasıl mümkün olabilir? Savedstatehandle'ı yapıcıya kim iletir?
Neeraja Gandla

Uygulamanın bağlantısını paylaşabilir misiniz ? Uygulamayı Android Studio'da yerel olarak çalıştırdınız mı ? Codelab'da belirtilen koda github bağlantısı bazı kullanım durumlarından ve çözümlerinden bahsettiğinden, tam bir uygulama gibi tam teşekküllü bir çözüm yoktur
Karunesh Palekar

Kaynak kodunu buradan indirebilirsiniz: developer.android.com/codelabs/android-lifecycles#1
Neeraja Gandla

Ayrıca lütfen sorunun Düzenleme bölümüne bakın
Neeraja Gandla

Cevabını aldığına sevindim .
Karunesh Palekar

Olabilir ayrıntılı daha fazla düzenlemek . Tam olarak bilmek istediğin içeriği alamıyorum. ViewModel, ekran yönlendirmesi için verilerinizi önbelleğe almanın ekstra işlevselliğini sağlar, bu nedenle bu işlevselliği sağlamak için geliştiricilerin bir yolunu bulmaları gerekiyordu , burada buldukları buydu . Hepimiz android geliştiricileri kariyerimizde bu tür örneklerden çok geçmek zorundayız, umarım anlarsınız
Karunesh Palekar

Neeraja Gandla

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................