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
}
}