Dlaczego warto używać ViewModel?
Sprawnie zachowuj stan podczas zmian konfiguracji
Dlaczego warto używać ViewModel? to bezpłatna lekcja Android Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Android Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Android Academy zawiera 4 lekcji w sumie.
Czym jest ViewModel?
ViewModel to komponent architektury Androida zaprojektowany do przechowywania i zarządzania danymi związanymi z interfejsem w sposób uwzględniający cykl życia.
Przetrwa zmiany konfiguracji, takie jak obrót ekranu, dzięki czemu dane nie zostaną zniszczone i utworzone ponownie za każdym razem, gdy system odbuduje interfejs.
Problem zmian konfiguracji
Po obróceniu urządzenia Android niszczy i ponownie tworzy obiekt Activity. Cały stan przechowywany w obiekcie Activity lub Composable zostaje utracony.
- Licznik zostaje wyzerowany.
- Załadowana lista znika.
- Żądanie sieciowe może zostać uruchomione ponownie.
ViewModel rozwiązuje ten problem, ponieważ działa poza cyklem życia instancji Activity.
Jak ViewModel przetrwa
Platforma utrzymuje tę samą instancję ViewModel przy życiu podczas ponownego tworzenia komponentów. Po utworzeniu nowego obiektu Activity otrzymuje on istniejący ViewModel, a nie nową instancję.
class CounterViewModel : ViewModel() {
var count = 0
private set
fun increment() {
count++
}
}Pobieranie ViewModel w Compose
W Jetpack Compose ViewModel zwykle pobiera się za pomocą pomocniczej funkcji viewModel(). Zwraca ona tę samą instancję dla właściciela cyklu życia.
import androidx.lifecycle.viewmodel.compose.viewModel
@Composable
fun CounterScreen(
vm: CounterViewModel = viewModel()
) {
Text("Count: " + vm.count)
}Rozdzielenie odpowiedzialności
ViewModel pomaga zachować przejrzysty podział:
- Warstwa interfejsu (Composable/Activity) tylko wyświetla stan i przekazuje zdarzenia.
- ViewModel przechowuje stan i logikę biznesową.
Dzięki temu interfejs jest prostszy, a logikę łatwiej testować.
Zakres i właściciel ViewModel
ViewModel ma zakres wyznaczony przez ViewModelStoreOwner, którym zwykle jest Activity, Fragment lub wpis stosu powrotu nawigacji.
Jest automatycznie czyszczony, gdy ten właściciel zostanie trwale zniszczony, na przykład gdy użytkownik zamknie Activity przyciskiem Wstecz.
Funkcja zwrotna onCleared
Gdy ViewModel zostanie ostatecznie zniszczony, platforma wywołuje onCleared(). Użyj tej funkcji, aby zwolnić otwarte zasoby.
class MyViewModel : ViewModel() {
override fun onCleared() {
super.onCleared()
// cancel jobs, close listeners
}
}Czego NIE umieszczać w ViewModel
Nigdy nie przechowuj w ViewModel odwołań do Views, Activities ani żadnego obiektu Context powiązanego z interfejsem. Ponieważ ViewModel żyje dłużej niż Activity, prowadzi to do wycieków pamięci.
Jeśli potrzebujesz kontekstu aplikacji, użyj zamiast tego AndroidViewModel.
AndroidViewModel dla kontekstu aplikacji
Gdy rzeczywiście potrzebujesz obiektu Context, rozszerz klasę AndroidViewModel, która bezpiecznie udostępnia długowieczny kontekst aplikacji.
class PrefsViewModel(
app: Application
) : AndroidViewModel(app) {
private val context = getApplication<Application>()
}Przekazywanie argumentów konstruktora
Aby wstrzykiwać zależności (takie jak repozytorium) do ViewModel, użyj ViewModelFactory lub frameworka DI, takiego jak Hilt. Hilt omówimy później w tej ścieżce.
class UserViewModel(
private val repo: UserRepository
) : ViewModel() {
// repo provided via a factory or Hilt
}Dlaczego ViewModel ma znaczenie
ViewModel jest jednym z fundamentów nowoczesnej architektury Androida. Zapewnia:
- Przetrwanie zmian konfiguracji.
- Przejrzysty podział między interfejsem a logiką.
- Przewidywalne zarządzanie stanem, które można testować.
Szybkie sprawdzenie
Sprawdź, czy rozumiesz, dlaczego używa się ViewModel.
Podsumowanie
Nauczyłeś się, że:
- ViewModel przechowuje stan interfejsu i przetrwa zmiany konfiguracji.
- Nigdy nie może przechowywać odwołań do View ani Activity, aby uniknąć wycieków.
- Ma zakres wyznaczony przez właściciela i jest czyszczony za pomocą
onCleared(). AndroidViewModeludostępnia bezpieczny Context aplikacji.
Często zadawane pytania
Czy lekcja „Dlaczego warto używać ViewModel?” jest bezpłatna?
Tak — pełny tekst „Dlaczego warto używać ViewModel?” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Android Academy, przejdź na CoddyKit PRO. Kurs Android Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Dlaczego warto używać ViewModel?”?
Sprawnie zachowuj stan podczas zmian konfiguracji Ćwiczysz Android Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Android Academy?
Nie wymagamy żadnego doświadczenia. Android Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Dlaczego warto używać ViewModel?”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Android Academy?
Tak. Każda lekcja Android Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Dlaczego warto używać ViewModel?
- Udostępnianie stanu z ViewModel
- Cykl życia Androida
- collectAsStateWithLifecycle