Sobes.tech
Junior

Fale sobre o padrão MVVM.

sobes.tech IA

Resposta da IA

O Modelo-Visão-Modelo de Vista (MVVM) é um padrão arquitetónico que separa a interface de utilizador (Vista) da lógica de negócio (Modelo) através de um intermediário: o Modelo de Vista (ViewModel).

  • Modelo: Representa os dados e a lógica de negócio da aplicação. Não contém lógica específica de UI.
  • Vista: Exibe os dados do ViewModel e envia ações do utilizador (por exemplo, cliques em botões) ao ViewModel. Não contém lógica de negócio, apenas lógica de apresentação.
  • ViewModel: Atua como uma ligação. Fornece dados do Modelo para a Vista num formato adequado para exibição e processa as solicitações da Vista, atualizando o Modelo. Contém a lógica de apresentação, mas não manipula diretamente a Vista. Frequentemente usa LiveData ou StateFlow para atualizações reativas da Vista.

Vantagens:

  • Separação de responsabilidades: Melhora a legibilidade e a manutenção do código.
  • Testabilidade: O ViewModel é fácil de testar isoladamente, pois não depende da API Android.
  • Suporte à sobrevivência: O ViewModel sobrevive a alterações de configuração (por exemplo, rotação de ecrã) e evita reobter dados.
  • Melhoria na modularidade.

Exemplo de estrutura:

// Modelo (repositório de exemplo)
class UserRepository {
    fun getUsers(): List<User> {
        // ... lógica de obtenção de utilizadores ...
        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()
    }
}

// Vista (Fragmento/Atividade)
class UserFragment : Fragment() {
    private val viewModel: UserViewModel by viewModels() // Uso do delegado do Android KTX

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

        viewModel.users.observe(viewLifecycleOwner) { userList ->
            // Atualizar UI (por exemplo, adaptador RecyclerView)
            updateUI(userList)
        }
    }

    private fun updateUI(userList: List<User>) {
        // Lógica de atualização de TextView, RecyclerView, etc.
    }
}