Sobes.tech
Junior

Erzählen Sie mir vom MVVM-Muster.

sobes.tech KI

Antwort von AI

Das Model-View-ViewModel (MVVM) ist ein Architektur-Muster, das die Benutzeroberfläche (View) von der Geschäftslogik (Model) durch einen Vermittler trennt: das ViewModel.

  • Model: Repräsentiert die Daten und die Geschäftslogik der Anwendung. Enthält keine UI-spezifische Logik.
  • View: Zeigt die Daten aus dem ViewModel an und sendet Benutzeraktionen (z.B. Button-Klicks) an das ViewModel. Enthält keine Geschäftslogik, nur Präsentationslogik.
  • ViewModel: Agiert als Bindeglied. Stellt die Daten aus dem Model in einem für die Anzeige geeigneten Format bereit und verarbeitet Anfragen der View, indem es das Model aktualisiert. Enthält Präsentationslogik, manipuliert die View aber nicht direkt. Verwendet häufig LiveData oder StateFlow für reaktive Updates.

Vorteile:

  • Verantwortlichkeitsaufteilung: Verbessert die Lesbarkeit und Wartbarkeit des Codes.
  • Testbarkeit: Das ViewModel ist leicht isoliert testbar, da es nicht von der Android-API abhängt.
  • Lebenszyklus-Unterstützung: Das ViewModel überlebt Konfigurationsänderungen (z.B. Bildschirmrotation) und vermeidet erneutes Datenholen.
  • Verbesserte Modularität.

Beispielstruktur:

// Modell (Repository-Beispiel)
class UserRepository {
    fun getUsers(): List<User> {
        // ... Logik zum Abrufen von Benutzern ...
        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() // Verwendung des Delegaten von Android KTX

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

        viewModel.users.observe(viewLifecycleOwner) { userList ->
            // UI aktualisieren (z.B. RecyclerView-Adapter)
            updateUI(userList)
        }
    }

    private fun updateUI(userList: List<User>) {
        // Logik zur Aktualisierung von TextView, RecyclerView usw.
    }
}