Junior
Μίλησε για το μοτίβο MVVM.
sobes.tech AI
Απάντηση από AI
Το μοντέλο-προβολή-μοντέλο προβολής (MVVM) είναι ένα αρχιτεκτονικό μοτίβο που διαχωρίζει το περιβάλλον χρήστη (View) από τη λογική επιχειρήσεων (Model) χρησιμοποιώντας έναν μεσάζοντα: το ViewModel.
- Model: Αντιπροσωπεύει τα δεδομένα και τη λογική επιχειρήσεων της εφαρμογής. Δεν περιέχει ειδική λογική UI.
- View: Εμφανίζει τα δεδομένα από το ViewModel και στέλνει ενέργειες χρήστη (π.χ. πατήματα κουμπιών) στο ViewModel. Δεν περιέχει λογική επιχειρήσεων, μόνο λογική παρουσίασης.
- ViewModel: λειτουργεί ως σύνδεσμος. Παρέχει δεδομένα από το Model στη μορφή που είναι κατάλληλη για εμφάνιση και επεξεργάζεται τα αιτήματα από το View, ενημερώνοντας το Model. Περιέχει λογική παρουσίασης, αλλά δεν χειρίζεται άμεσα το View. Συχνά χρησιμοποιεί LiveData ή StateFlow για αντιδραστικές ενημερώσεις.
Πλεονεκτήματα:
- Διαχωρισμός ευθυνών: Βελτιώνει την αναγνωσιμότητα και τη συντηρησιμότητα του κώδικα.
- Δοκιμαστικότητα: Το ViewModel είναι εύκολο να δοκιμαστεί απομόνως, καθώς δεν εξαρτάται από το Android API.
- Υποστήριξη για επιβίωση: Το ViewModel επιβιώνει από αλλαγές διαμόρφωσης (π.χ. περιστροφή οθόνης) και αποφεύγει την επαναφόρτωση δεδομένων.
- Βελτιωμένη modularity.
Παραδείγματα δομής:
// Model (παραδείγματος αποθετήριο)
class UserRepository {
fun getUsers(): List<User> {
// ... λογική λήψη χρηστών ...
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/Activity)
class UserFragment : Fragment() {
private val viewModel: UserViewModel by viewModels() // Χρήση του Android KTX delegate
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.users.observe(viewLifecycleOwner) { userList ->
// Ενημέρωση UI (π.χ. RecyclerView adapter)
updateUI(userList)
}
}
private fun updateUI(userList: List<User>) {
// Λογική ενημέρωσης TextView, RecyclerView κ.λπ.
}
}