Preferensi DataStore
Ganti SharedPreferences dengan pustaka DataStore modern. Baca data sebagai Kotlin Flow, tulis menggunakan edit{}, dan tangani error dengan aman.
Preferensi DataStore adalah pelajaran Android Academy gratis di CoddyKit. Ini adalah pelajaran 5 dari 6. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Android Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Android Academy mencakup 6 pelajaran total.
Mengapa DataStore?
DataStore adalah pengganti modern untuk SharedPreferences. DataStore mengatasi masalah nyata:
- SharedPreferences memblokir thread UI — DataStore sepenuhnya asinkron
- SharedPreferences dapat menimbulkan pengecualian yang tidak tertangani — DataStore menangani error melalui Flow
- DataStore memiliki keamanan tipe (Preferences) atau keamanan skema (Proto)
- Bekerja secara native dengan Kotlin Coroutines dan Flow
Dua Jenis DataStore
Pilih jenis yang sesuai dengan kebutuhan Anda:
- Preferences DataStore — pasangan kunci-nilai, tanpa skema. Paling sederhana untuk disiapkan. Cocok untuk setelan aplikasi dan preferensi pengguna.
- Proto DataStore — objek bertipe menggunakan Protocol Buffers. Memerlukan berkas skema .proto. Cocok jika Anda memiliki data terstruktur.
Pelajaran ini membahas Preferences DataStore.
Menambahkan Dependensi
Tambahkan DataStore ke app/build.gradle:
// app/build.gradle
dependencies {
implementation 'androidx.datastore:datastore-preferences:1.1.1'
// Coroutines (likely already in your project)
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3'
}Membuat Instans DataStore
Buat DataStore satu kali menggunakan delegasi tingkat atas. Biasanya dilakukan dalam berkas terpisah:
import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.preferencesDataStore
// Top-level property — creates a single DataStore instance per Context
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "user_prefs")Mendefinisikan Kunci
Kunci adalah objek yang aman terhadap tipe, bukan string biasa. Buat kunci dengan fungsi pabrik yang tepat:
import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.intPreferencesKey
import androidx.datastore.preferences.core.stringPreferencesKey
object PreferencesKeys {
val DARK_MODE = booleanPreferencesKey("dark_mode")
val USER_NAME = stringPreferencesKey("user_name")
val LAUNCH_COUNT = intPreferencesKey("launch_count")
}Menulis Data
Lakukan penulisan di dalam coroutine menggunakan edit { }:
import androidx.datastore.preferences.core.edit
// In a ViewModel or Repository:
suspend fun saveDarkMode(enabled: Boolean) {
context.dataStore.edit { prefs ->
prefs[PreferencesKeys.DARK_MODE] = enabled
}
}
suspend fun incrementLaunchCount() {
context.dataStore.edit { prefs ->
val current = prefs[PreferencesKeys.LAUNCH_COUNT] ?: 0
prefs[PreferencesKeys.LAUNCH_COUNT] = current + 1
}
}Membaca Data dengan Flow
DataStore menyediakan data sebagai Flow. Gunakan map untuk mengambil nilai yang Anda perlukan:
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
val darkModeFlow: Flow<Boolean> = context.dataStore.data
.map { prefs ->
prefs[PreferencesKeys.DARK_MODE] ?: false // default = false
}
val userNameFlow: Flow<String> = context.dataStore.data
.map { prefs ->
prefs[PreferencesKeys.USER_NAME] ?: "Guest"
}Mengumpulkan Data di ViewModel
Sediakan Flow dari DataStore melalui ViewModel menggunakan stateIn agar pengumpulan data berlangsung efisien:
class SettingsViewModel(private val repo: SettingsRepository) : ViewModel() {
val isDarkMode: StateFlow<Boolean> = repo.darkModeFlow
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = false
)
fun toggleDarkMode(enabled: Boolean) {
viewModelScope.launch {
repo.saveDarkMode(enabled)
}
}
}Mengamati di Activity/Fragment
Kumpulkan StateFlow di UI menggunakan lifecycleScope.launch:
// In Fragment:
lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.isDarkMode.collect { darkMode ->
binding.switchDarkMode.isChecked = darkMode
AppCompatDelegate.setDefaultNightMode(
if (darkMode) AppCompatDelegate.MODE_NIGHT_YES
else AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
)
}
}
}Penanganan Kesalahan
DataStore menghasilkan IOException jika berkas rusak. Tangkap kesalahan tersebut dalam alur Flow Anda:
import kotlinx.coroutines.flow.catch
import java.io.IOException
val safeFlow: Flow<Boolean> = context.dataStore.data
.catch { exception ->
if (exception is IOException) {
emit(emptyPreferences()) // return defaults
} else {
throw exception
}
}
.map { prefs ->
prefs[PreferencesKeys.DARK_MODE] ?: false
}DataStore vs SharedPreferences
Ringkasan alasan DataStore lebih unggul:
- DataStore membaca dan menulis secara otomatis di thread latar belakang — tanpa risiko ANR
apply()milik SharedPreferences dapat gagal secara diam-diam; DataStore meneruskan kesalahan melalui Flow- DataStore bersifat reaktif — UI diperbarui secara otomatis saat data berubah
- SharedPreferences tidak memiliki jalur migrasi; DataStore memiliki
SharedPreferencesMigrationbawaan
Pemeriksaan Singkat
Apa mekanisme utama yang digunakan DataStore untuk menyediakan datanya kepada bagian lain aplikasi?
Ringkasan: Preferences DataStore
DataStore adalah cara modern untuk menyimpan data sederhana secara permanen:
- Tambahkan dependensi
datastore-preferences - Buat satu instans dengan delegasi
preferencesDataStore - Definisikan kunci yang aman terhadap tipe dengan
stringPreferencesKey,booleanPreferencesKey, dan sebagainya - Tulis data dengan
dataStore.edit { }di dalam coroutine - Baca data sebagai
FlowdengandataStore.data.map { } - Tangani
IOExceptiondengan.catch { emit(emptyPreferences()) }
Berikutnya: buat adaptor daftar yang efisien dengan DiffUtil.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Preferensi DataStore” gratis?
Ya — teks lengkap “Preferensi DataStore” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Android Academy, upgrade ke CoddyKit PRO. Kursus Android Academy mencakup 6 pelajaran total.
Apa yang akan aku pelajari di “Preferensi DataStore”?
Ganti SharedPreferences dengan pustaka DataStore modern. Baca data sebagai Kotlin Flow, tulis menggunakan edit{}, dan tangani error dengan aman. Kamu berlatih Android Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Android Academy?
Tidak diperlukan pengalaman sebelumnya. Android Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 5 dari 6.
Berapa lama pelajaran “Preferensi DataStore” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Android Academy ini?
Ya. Setiap pelajaran Android Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Koleksi Kotlin
- Dasar RecyclerView
- Peristiwa Klik RecyclerView
- SharedPreferences
- Preferensi DataStore
- Adapter & DiffUtil