Sobes.tech
Junior

Pověz mi o vzoru MVVM.

sobes.tech AI

Odpověď od AI

Model-View-ViewModel (MVVM) je architektonický vzor, který odděluje uživatelské rozhraní (View) od obchodní logiky (Model) pomocí prostředníka: ViewModel.

  • Model: Reprezentuje data a obchodní logiku aplikace. Neobsahuje žádnou UI-specifickou logiku.
  • View: Zobrazuje data z ViewModel a odesílá akce uživatele (například stisknutí tlačítek) do ViewModel. Neobsahuje obchodní logiku, pouze logiku zobrazení.
  • ViewModel: Funguje jako spojovací článek. Poskytuje data z Modelu ve vhodném formátu pro zobrazení a zpracovává požadavky z View, aktualizuje Model. Obsahuje logiku zobrazení, ale přímo ne manipulujte s View. Často používá LiveData nebo StateFlow pro reaktivní aktualizace.

Výhody:

  • Oddělení odpovědností: Zlepšuje čitelnost a udržovatelnost kódu.
  • Testovatelnost: ViewModel je snadno testovatelný v izolaci, protože nezávisí na Android API.
  • Podpora životního cyklu: ViewModel přežije změny konfigurace (například otočení obrazovky) a vyhýbá se opětovnému načítání dat.
  • Vylepšená modularita.

Příklad struktury:

// Model (příklad repozitáře)
class UserRepository {
    fun getUsers(): List<User> {
        // ... logika získávání uživatelů ...
        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() // Použití delegáta od Android KTX

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

        viewModel.users.observe(viewLifecycleOwner) { userList ->
            // Aktualizace UI (například adaptér RecyclerView)
            updateUI(userList)
        }
    }

    private fun updateUI(userList: List<User>) {
        // Logika aktualizace TextView, RecyclerView atd.
    }
}