StateFlow i SharedFlow
Udostępniaj stan reaktywny z aplikacji
StateFlow i SharedFlow to bezpłatna lekcja Android Academy na CoddyKit. To lekcja 4 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.
Gorące przepływy
W przeciwieństwie do zimnych przepływów, StateFlow i SharedFlow są gorące: istnieją niezależnie od odbiorców i mogą być współdzielone przez wielu odbiorców.
StateFlow przechowuje stan
StateFlow zawsze przechowuje jedną bieżącą wartość. Nowi odbiorcy natychmiast otrzymują tę najnowszą wartość. Doskonale nadaje się do przechowywania stanu interfejsu.
private val _count = MutableStateFlow(0)
val count: StateFlow<Int> = _count.asStateFlow()Aktualizowanie StateFlow
Ustawiaj bezpośrednio właściwość .value lub używaj update do atomowej operacji odczytu, modyfikacji i zapisu.
_count.value++
// or, atomically:
_count.update { it + 1 }StateFlow scala i usuwa duplikaty
StateFlow przechowuje tylko najnowszą wartość (scala wartości) i nie emituje nowej, jeśli jest ona równa poprzedniej. Zapobiega to zbędnym aktualizacjom interfejsu.
SharedFlow do zdarzeń
SharedFlow nie wymaga bieżącej wartości i może odtwarzać skonfigurowaną liczbę wcześniejszych emisji. Nadaje się do jednorazowych zdarzeń, takich jak nawigacja lub wyświetlenie paska Snackbar.
private val _events = MutableSharedFlow<String>()
val events: SharedFlow<String> = _events.asSharedFlow()Emitowanie zdarzeń
Emituj wartości do SharedFlow z poziomu korutyny.
fun onSave() {
viewModelScope.launch {
_events.emit("Saved!")
}
}Dlaczego nie używać StateFlow do zdarzeń
StateFlow przechowuje ostatnią wartość, więc odbiorca, który zasubskrybuje strumień ponownie (po obrocie ekranu), otrzyma stare zdarzenie jeszcze raz i może na przykład wykonać nawigację dwukrotnie. SharedFlow domyślnie nie odtwarza wcześniejszych emisji.
Konfigurowanie SharedFlow
Dostosuj replay i extraBufferCapacity, aby kontrolować buforowanie i zachowanie związane z back-pressure.
MutableSharedFlow<String>(
replay = 0,
extraBufferCapacity = 1
)Konwertowanie zimnego Flow na StateFlow
Użyj stateIn, aby przekształcić zimny strumień źródłowy we współdzielony StateFlow powiązany z zakresem ViewModelu.
val uiState = repo.stream()
.stateIn(
viewModelScope,
SharingStarted.WhileSubscribed(5000),
UiState()
)Wybór między nimi
- StateFlow → bieżący stan ekranu (zawsze ma wartość).
- SharedFlow → przejściowe zdarzenia (wykonywane raz).
Zbieranie obu typów
Zbieraj StateFlow w Compose za pomocą collectAsStateWithLifecycle; zdarzenia SharedFlow zbieraj wewnątrz LaunchedEffect, aby obsłużyć je tylko raz.
LaunchedEffect(Unit) {
vm.events.collect { msg -> showSnackbar(msg) }
}Szybki sprawdzian
Sprawdź swoją wiedzę na temat StateFlow i SharedFlow.
Podsumowanie
Dowiedziałeś się, że:
- StateFlow to gorący, scalający się nośnik stanu z bieżącą wartością.
- SharedFlow to gorący strumień zdarzeń z konfigurowalnym mechanizmem replay.
- StateFlow służy do przechowywania stanu, a SharedFlow do zdarzeń jednorazowych.
stateInkonwertuje zimne przepływy na StateFlow.
Ucz się Kotlin dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 36
- Lekcje
- 152
Często zadawane pytania
Czy lekcja „StateFlow i SharedFlow” jest bezpłatna?
Tak — pełny tekst „StateFlow i SharedFlow” 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 „StateFlow i SharedFlow”?
Udostępniaj stan reaktywny z aplikacji Ć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 4 z 4.
Ile czasu zajmuje lekcja „StateFlow i SharedFlow”?
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
- Podstawy korutyn i zakresów
- viewModelScope i Dispatchers
- Podstawy Kotlin Flow
- StateFlow i SharedFlow