Sobes.tech
Junior

Vorbește despre modelul MVVM.

sobes.tech AI

Răspuns de la AI

Model-View-ViewModel (MVVM) este un pattern arhitectural care separă interfața utilizatorului (View) de logica de business (Model) folosind un intermediar: ViewModel.

  • Model: Reprezintă datele și logica de business a aplicației. Nu conține logică specifică UI-ului.
  • View: Afișează datele din ViewModel și trimite acțiunile utilizatorului (de exemplu, apăsări de butoane) către ViewModel. Nu conține logică de business, doar logică de prezentare.
  • ViewModel: Funcționează ca un legătură. Oferă date din Model pentru View într-un format potrivit pentru afișare și procesează solicitările de la View, actualizând Modelul. Conține logica de prezentare, dar nu manipulează direct View-ul. Adesea folosește LiveData sau StateFlow pentru actualizări reactive.

Avantaje:

  • Separarea responsabilităților: Îmbunătățește lizibilitatea și întreținerea codului.
  • Testabilitate: ViewModel este ușor de testat în izolare, deoarece nu depinde de API-ul Android.
  • Suport pentru durabilitate: ViewModel supraviețuiește schimbărilor de configurație (de exemplu, rotirea ecranului) și evită reobținerea datelor.
  • Modularitate îmbunătățită.

Exemplu de structură:

// Model (repositoriu de exemplu)
class UserRepository {
    fun getUsers(): List<User> {
        // ... logica de obținere a utilizatorilor ...
        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/Activitate)
class UserFragment : Fragment() {
    private val viewModel: UserViewModel by viewModels() // Utilizarea delegatului Android KTX

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

        viewModel.users.observe(viewLifecycleOwner) { userList ->
            // Actualizarea UI (de exemplu, adaptor RecyclerView)
            updateUI(userList)
        }
    }

    private fun updateUI(userList: List<User>) {
        // Logica de actualizare TextView, RecyclerView etc.
    }
}