Android Jetpack DataStore存储数据

修改下之前的代办事项demo,主题开关本来写的全局变量,改成用DataStore持久化存储。

先添加依赖:

创建PreferencesKeys文件保存键值:

Kotlin 复制代码
package com.example.testcompose1.data

import androidx.datastore.preferences.core.booleanPreferencesKey

object PreferencesKeys {
    val DARK_MODE = booleanPreferencesKey("dark_mode")
}

创建DataStore管理类:

Kotlin 复制代码
package com.example.testcompose1.data

import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.preferencesDataStore
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map

// 创建一个名为 user_preferences 的偏好设置存储文件
private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "user_preferences")

// DataStore 管理类
class PreferencesManager(context: Context) {
    private val dataStore = context.dataStore

    val darkModeFlow: Flow<Boolean> = dataStore.data
        .map { preferences ->
            preferences[PreferencesKeys.DARK_MODE] ?: false
        }

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

创建SettingsViewModel 管理主题:

Kotlin 复制代码
package com.example.testcompose1

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.testcompose1.data.PreferencesManager
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch

class SettingsViewModel(
    private val preferencesManager: PreferencesManager
) : ViewModel() {

    // 把 DataStore 流(Flow)转换成 ViewModel 里的状态(State) .
    // stateIn:把冷流 Flow 转成热流 State
    val isDarkTheme = preferencesManager.darkModeFlow.stateIn(
        viewModelScope,
        SharingStarted.WhileSubscribed(5000), // UI 离开页面 5 秒后自动停止订阅,节省资源
        false
    )

    fun toggleDarkMode() { // 切换主题
        viewModelScope.launch {
            preferencesManager.setDarkMode(!(isDarkTheme.value ?: false))
        }
    }
}

修改compose函数,使用SettingsViewModel

修改开关状态的取值从settingsViewModel中获取,切换开关也是调用settingsViewModel中的切换函数:

原有的废代码去掉:

运行下:

先切换到深色:

杀进程,重启应用:

ok. 还是深色模式,状态记住了。

相关推荐
寰宇星城2 小时前
AppActuator - 让 AI Agent 直接理解并操作运行中的 Android App
android
波罗丁牌2 小时前
uni-app 实现视频聊天、屏幕分享,支持Android、HarmonyOS、iOS
android·uni-app·音视频
峥嵘life2 小时前
Android WiFi 热点 Channel 信道 和 Frequency 频率 转换总结
android·开发语言
jieyucx3 小时前
【高级利用】条件竞争与逻辑漏洞:与服务器赛跑的艺术
android·运维·服务器·web安全·文件上传
叶辞树5 小时前
死锁问题分析
android
TimeFine5 小时前
让 Codex “用上”Android Studio:JetBrains MCP Server 接入与实践
android
__Witheart__7 小时前
3568 Android 设置首次烧录后 usb otg 口模式
android·adb·rockchip
AFinalStone7 小时前
Android 7系统编译与刷机(三)从编译产物到高通刷机包
android·系统编译
AFinalStone7 小时前
Android 7系统编译与刷机(四)QFIL刷机工具详解
android·系统编译
plainGeekDev8 小时前
JUnit 4 → JUnit 5 + Kotlin
android·java·kotlin