Sobes.tech
Junior

Beszélj az MVVM mintáról.

sobes.tech MI

Válasz az MI-től

A Model-View-ViewModel (MVVM) egy architektúrális minta, amely elválasztja a felhasználói felületet (View) az üzleti logikától (Model), egy közvetítő segítségével: a ViewModel.

  • Model: Az alkalmazás adatait és üzleti logikáját reprezentálja. Nem tartalmaz UI-specifikus logikát.
  • View: Megjeleníti a ViewModel-ből származó adatokat, és küldi a felhasználói műveleteket (pl. gombnyomásokat) a ViewModel-nek. Nem tartalmaz üzleti logikát, csak megjelenítési logikát.
  • ViewModel: Közvetítőként működik. Az adatokat a Model-ből a megjelenítéshez megfelelő formátumban szolgáltatja, és feldolgozza a View kérését, frissítve a Model-t. Tartalmazza a megjelenítési logikát, de nem manipulálja közvetlenül a View-t. Gyakran használ LiveData-t vagy StateFlow-t a reaktív frissítésekhez.

Előnyök:

  • Felelősségek szétválasztása: Javítja a kód olvashatóságát és karbantarthatóságát.
  • Tesztelhetőség: A ViewModel könnyen tesztelhető izoláltan, mivel nem függ az Android API-tól.
  • Életciklus támogatás: A ViewModel túléli a konfigurációs változásokat (pl. képernyőforgatás), és elkerüli az adatok újra lekérését.
  • Jobb modularitás.

Példa szerkezet:

// Modell (példa repository)
class UserRepository {
    fun getUsers(): List<User> {
        // ... felhasználók lekérdezésének logikája ...
        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()
    }
}

// Nézet (Fragment/Activity)
class UserFragment : Fragment() {
    private val viewModel: UserViewModel by viewModels() // Android KTX delegátus használata

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

        viewModel.users.observe(viewLifecycleOwner) { userList ->
            // UI frissítése (pl. RecyclerView adapter)
            updateUI(userList)
        }
    }

    private fun updateUI(userList: List<User>) {
        // TextView, RecyclerView stb. frissítési logika
    }
}