Sobes.tech
Middle

Android mimari bileşenlerinde ViewModel durumunu nasıl saklarım?

sobes.tech yapay zeka

AI'dan gelen yanıt

ViewModel durumunu birkaç farklı yöntemle saklayabilirsiniz:

  1. SavedStateHandle Kullanımı: Sürecin yok edilmesinden sonra durumu geri yüklemek için gereken küçük veri miktarlarını saklamak için tercih edilen yöntemdir. SavedStateHandle, veri saklama ve alma için Map-benzeri bir arayüz sağlar.

    class MyViewModel(private val state: SavedStateHandle) : ViewModel() {
    
        private val _name = state.getLiveData<String>("name")
        val name: LiveData<String> = _name
    
        fun saveName(newName: String) {
            state.set("name", newName)
        }
    }
    
  2. Bundle (Bundle) içinde durumu kaydetme: onSaveInstanceState ile birlikte kullanılır, kendi Activity veya Fragment'in verilerini kaydetmek için, doğrudan ViewModel değil. Bu veriler, ViewModel oluşturulurken kullanılmak üzere kullanılabilir.

    // Activity veya Fragment'ta
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // ViewModel'in başlatılması için kullanılacak verilerin kaydedilmesi
        outState.putString("some_data_for_vm", "önemli değer")
    }
    
    // ViewModel'de verilerin kullanımı (fabrika aracılığıyla)
    class MyViewModelFactory(private val initialData: String) : ViewModelProvider.Factory {
        override fun <T : ViewModel?> create(modelClass: Class<T>): T {
            if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
                @Suppress("UNCHECKED_CAST")
                return MyViewModel(initialData) as T
            }
            throw IllegalArgumentException("Bilinmeyen ViewModel sınıfı")
        }
    }
    
    class MyViewModel(private val initialData: String) : ViewModel() {
        // Durumu geri yüklemek için initialData kullanımı
    }
    
  3. Kalıcı depolama alanında veri kaydetme: Daha karmaşık veya büyük veri hacimleri için SharedPreferences, veritabanları (örneğin, Room) veya dosyalar kullanılabilir. ViewModel, bu verilere erişimi yöneten bir repository ile etkileşime geçebilir.

    class MyViewModel(private val userRepository: UserRepository) : ViewModel() {
        fun saveUser(user: User) {
            userRepository.saveUser(user)
        }
    
        fun getUser(id: Long): LiveData<User> {
            return userRepository.getUser(id)
        }
    }
    
    // UserRepository örneği
    class UserRepository(private val userDao: UserDao) {
        fun saveUser(user: User) {
            // Veritabanına kaydetme mantığı
        }
    
        fun getUser(id: Long): LiveData<User> {
            // Veritabanından alma mantığı
        }
    }
    

Yöntem seçimi, saklanacak veri türüne ve hacmine, ayrıca hangi durum kurtarma senaryolarının desteklenmesi gerektiğine bağlıdır (örneğin, süreç yok edilmesi vs. yapılandırma değişikliği). SavedStateHandle, yok edilme sonrası durumu korumak ve UI'yi geri yüklemek için en uygun olanıdır.