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