Sobes.tech
Junior

Реци о патерну MVVM.

sobes.tech АИ

Одговор од АИ

Model-View-ViewModel (MVVM) je arhitektonski obrazac koji odvojeno prikazuje korisnički interfejs (View) od poslovne logike (Model) pomoću posrednika: ViewModel.

  • Model: Predstavlja podatke i poslovnu logiku aplikacije. Ne sadrži UI-specifičnu logiku.
  • View: Prikazuje podatke iz ViewModel-a i šalje akcije korisnika (npr. pritiske na dugmad) u ViewModel. Ne sadrži poslovnu logiku, samo logiku prikaza.
  • ViewModel: Funkcioniše kao veza. Pruža podatke iz Modela u formatu pogodan za prikaz i obrađuje zahteve od View-a, ažurirajući Model. Sadrži logiku prikaza, ali ne manipuliše direktno sa View-om. Često koristi LiveData ili StateFlow za reaktivna ažuriranja.

Prednosti:

  • Razdvajanje odgovornosti: Poboljšava čitljivost i održavanje koda.
  • Testabilnost: ViewModel je lako testirati izolovano, jer ne zavisi od Android API-ja.
  • Podrška za životni ciklus: ViewModel preživljava promene konfiguracije (npr. rotacija ekrana) i izbegava ponovno dobijanje podataka.
  • Poboljšana modularnost.

Primer strukture:

// Model (primer repozitorijuma)
class UserRepository {
    fun getUsers(): List<User> {
        // ... logika za dobijanje korisnika ...
        return listOf(User("Alice"), User("Bob"))
    }
}

// ViewModel
class UserViewModel(private val repository: UserRepository) : ViewModel() {
    private val _users = MutableLiveData<List<User>>()
    val users: LiveData<List<User>> = _users

    init {
        loadUsers()
    }

    private fun loadUsers() {
        _users.value = repository.getUsers()
    }
}

// View (Fragment/Activity)
class UserFragment : Fragment() {
    private val viewModel: UserViewModel by viewModels() // Korišćenje delegata od Android KTX

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        viewModel.users.observe(viewLifecycleOwner) { userList ->
            // Ažuriranje UI (npr. RecyclerView adapter)
            updateUI(userList)
        }
    }

    private fun updateUI(userList: List<User>) {
        // Logika za ažuriranje TextView, RecyclerView itd.
    }
}