0Pricing
Android Academy · Lekcja

Odczytywanie i zapisywanie ustawień

Zapisuj preferencje użytkownika i obserwuj ich zmiany

Odczytywanie i zapisywanie ustawień to bezpłatna lekcja Android Academy na CoddyKit. To lekcja 3 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.

Odczytywanie i zapisywanie

Po zdefiniowaniu kluczy dwie podstawowe operacje to odczytywanie przepływu danych oraz zapisywanie za pomocą edit. Odczyty są reaktywne, a zapisy są funkcjami zawieszającymi.

Przepływ danych

dataStore.data to obiekt Flow<Preferences>. Za każdym razem, gdy wykonasz zapis, przepływ emituje nową migawkę Preferences, dzięki czemu odbiorcy są automatycznie aktualizowani.

val rawData: Flow<Preferences> = dataStore.data

Mapowanie pojedynczej wartości

Rzadko potrzebujesz całego obiektu Preferences. Użyj map, aby wyodrębnić jeden klucz i zastosować wartość domyślną.

val darkMode: Flow<Boolean> = dataStore.data
    .map { prefs -> prefs[PrefKeys.DARK_MODE] ?: false }

Obsługa błędów odczytu

Odczyt z dysku może zakończyć się błędem IOException. Użyj catch przed map, aby emitować puste preferencje i utrzymać przepływ aktywny.

val darkMode: Flow<Boolean> = dataStore.data
    .catch { e ->
        if (e is IOException) emit(emptyPreferences())
        else throw e
    }
    .map { it[PrefKeys.DARK_MODE] ?: false }

Zapisywanie za pomocą edit

Aby zmienić wartości, wywołaj zawieszającą funkcję edit. Wewnątrz lambdy otrzymujesz modyfikowalny obiekt preferencji i ustawiasz w nim klucze. Cały blok stanowi jedną transakcję.

suspend fun setDarkMode(enabled: Boolean) {
    dataStore.edit { prefs ->
        prefs[PrefKeys.DARK_MODE] = enabled
    }
}

edit jest funkcją zawieszającą

Ponieważ edit jest funkcją zawieszającą, musisz wywołać ją z korutyny, zwykle wewnątrz ViewModel za pomocą viewModelScope.launch. Gwarantuje to wykonanie zapisu poza głównym wątkiem.

fun toggleDarkMode(value: Boolean) {
    viewModelScope.launch {
        repository.setDarkMode(value)
    }
}

Aktualizowanie wielu kluczy

W jednym bloku edit można ustawić kilka kluczy. Są one zatwierdzane razem, atomowo, więc obserwatorzy nigdy nie zobaczą częściowej aktualizacji.

dataStore.edit { prefs ->
    prefs[PrefKeys.USERNAME] = "ada"
    prefs[PrefKeys.DARK_MODE] = true
    prefs[PrefKeys.FONT_SIZE] = 16
}

Zwiększanie wartości

Wewnątrz edit możesz odczytać bieżącą wartość i obliczyć nową, co jest przydatne w przypadku liczników, takich jak liczba uruchomień.

suspend fun incrementLaunchCount() {
    dataStore.edit { prefs ->
        val current = prefs[PrefKeys.LAUNCH_COUNT] ?: 0
        prefs[PrefKeys.LAUNCH_COUNT] = current + 1
    }
}

Usuwanie i czyszczenie

Pojedynczy klucz usuwa się za pomocą remove, a cały magazyn czyści za pomocą clear; obie operacje wykonuje się wewnątrz bloku edit.

dataStore.edit { prefs ->
    prefs.remove(PrefKeys.USERNAME)
}

dataStore.edit { prefs ->
    prefs.clear()
}

Zbieranie danych w Compose

W komponencie Composable przekształć przepływ ViewModel w stan za pomocą collectAsStateWithLifecycle(). Interfejs użytkownika jest ponownie kompozytowany za każdym razem, gdy ustawienie się zmienia.

val darkMode by viewModel.darkMode.collectAsStateWithLifecycle(initial = false)

Switch(
    checked = darkMode,
    onCheckedChange = { viewModel.toggleDarkMode(it) }
)

Cykl odczyt–modyfikacja–zapis

Po połączeniu wszystkich elementów wygląda to tak: interfejs użytkownika odczytuje dane za pomocą przepływu, użytkownik zmienia ustawienie, ViewModel uruchamia korutynę wywołującą edit, DataStore zapisuje dane, przepływ emituje je ponownie, a interfejs użytkownika jest ponownie kompozytowany. Całość jest reaktywna.

Szybkie sprawdzenie

Sprawdź swoje rozumienie odczytywania i zapisywania.

Podsumowanie

Potrafisz już odczytywać i zapisywać ustawienia:

  • dataStore.data to reaktywny obiekt Flow<Preferences>
  • map wyodrębnia pojedynczą wartość, a catch obsługuje błędy wejścia-wyjścia
  • dataStore.edit { } wykonuje zapis atomowo z poziomu korutyny
  • collectAsStateWithLifecycle steruje interfejsem Compose

Następnie: typowane dane strukturalne za pomocą Proto DataStore.

Często zadawane pytania

Czy lekcja „Odczytywanie i zapisywanie ustawień” jest bezpłatna?

Tak — pełny tekst „Odczytywanie i zapisywanie ustawień” 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 „Odczytywanie i zapisywanie ustawień”?

Zapisuj preferencje użytkownika i obserwuj ich zmiany Ć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 3 z 4.

Ile czasu zajmuje lekcja „Odczytywanie i zapisywanie ustawień”?

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

  1. DataStore a SharedPreferences
  2. Preferences DataStore
  3. Odczytywanie i zapisywanie ustawień
  4. Proto DataStore
← Powrót do Android Academy