Sobes.tech
Junior

Papaskink apie MVVM modelį.

sobes.tech AI

Atsakymas iš AI

Modelis-Peržiūra-Modelio peržiūra (MVVM) — architektūros šablonas, kuris atskiria naudotojo sąsają (View) nuo verslo logikos (Modelis) per tarpininką — Peržiūros modelį (ViewModel).

  • Modelis: atstovauja duomenis ir programos verslo logiką. Nėra UI specifinės logikos.
  • Peržiūra: rodo duomenis iš ViewModel ir siunčia naudotojo veiksmus (pavyzdžiui, mygtukų paspaudimus) į ViewModel. Nėra verslo logikos, tik rodymo logika.
  • ViewModelis: veikia kaip jungtis. teikia duomenis iš Modelio naudotojui patogiu formatu ir apdoroja užklausas iš Peržiūros, atnaujindamas Modelį. Turi rodymo logiką, bet tiesiogiai nemano su View. Dažnai naudoja LiveData arba StateFlow reaktyviems atnaujinimams.

Privalumai:

  • Atsakomybės pasidalijimas: gerina kodo skaitomumą ir palaikymą.
  • Testuojamumas: ViewModel lengvai testuojamas izoliuotai, nes jis nepriklauso nuo Android API.
  • Gyvybingumo palaikymas: ViewModel išgyvena konfigūracijos pokyčius (pavyzdžiui, ekrano pasukimą) ir išvengia duomenų pakartotinio gavimo.
  • Pagerinta moduliaiškumas.

Pavyzdinė struktūra:

// Modelis (duomenų saugykla pavyzdžiui)
class UserRepository {
    fun getUsers(): List<User> {
        // ... duomenų gavimo logika ...
        return listOf(User("Alice"), User("Bob"))
    }
}

// ViewModelis
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()
    }
}

// Peržiūra (Fragment/Activity)
class UserFragment : Fragment() {
    private val viewModel: UserViewModel by viewModels() // Android KTX delegatas

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

        viewModel.users.observe(viewLifecycleOwner) { userList ->
            // UI atnaujinimas (pavyzdžiui, RecyclerView adapterio atnaujinimas)
            updateUI(userList)
        }
    }

    private fun updateUI(userList: List<User>) {
        // TextView, RecyclerView ir kt. atnaujinimo logika
    }
}