Sobes.tech
Junior

Vertel over het MVVM-patroon.

sobes.tech AI

Antwoord van AI

Het Model-View-ViewModel (MVVM) is een architectuurpatroon dat de gebruikersinterface (View) scheidt van de bedrijfslogica (Model) met behulp van een tussenlaag: de ViewModel.

  • Model: Vertegenwoordigt de gegevens en bedrijfslogica van de applicatie. Bevat geen UI-specifieke logica.
  • View: Toont de gegevens van de ViewModel en stuurt gebruikersacties (bijvoorbeeld knopdrukken) naar de ViewModel. Bevat geen bedrijfslogica, alleen presentatie-logica.
  • ViewModel: Functioneert als een schakel. Biedt gegevens uit het Model in een geschikt formaat voor de View en verwerkt verzoeken van de View door het Model bij te werken. Bevat presentatie-logica, maar manipuleert de View niet direct. Gebruikt vaak LiveData of StateFlow voor reactieve updates.

Voordelen:

  • Verantwoordelijkheden scheiden: Verbetert de leesbaarheid en onderhoudbaarheid van de code.
  • Testbaarheid: Het ViewModel is gemakkelijk te testen in isolatie, omdat het niet afhankelijk is van de Android API.
  • Ondersteuning voor levensduur: Het ViewModel overleeft configuratiewijzigingen (bijvoorbeeld schermrotatie) en voorkomt herhaald gegevens ophalen.
  • Verbeterde modulariteit.

Voorbeeldstructuur:

// Model (voorbeeld repository)
class UserRepository {
    fun getUsers(): List<User> {
        // ... logica voor het verkrijgen van gebruikers ...
        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() // Gebruik van de Android KTX-delegaat

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

        viewModel.users.observe(viewLifecycleOwner) { userList ->
            // UI bijwerken (bijvoorbeeld RecyclerView adapter)
            updateUI(userList)
        }
    }

    private fun updateUI(userList: List<User>) {
        // Logica voor het bijwerken van TextView, RecyclerView, enz.
    }
}