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. 还是深色模式,状态记住了。

相关推荐
北漂Zachary3 小时前
四大编程语言终极对比
android·java·php·laravel
学习使我健康7 小时前
Android App 启动原理
android·android studio
TechMix8 小时前
【性能工具】atrace、systrace、perfetto抓取的trace文件有何不同?
android·性能优化
张小潇8 小时前
AOSP15 WMS/AMS系统开发 - 窗口层级源码分析
android·前端
努力努力再努力wz11 小时前
【MySQL入门系列】掌握表数据的 CRUD:DML 核心语法与执行逻辑解析
android·开发语言·数据结构·数据库·c++·b树·mysql
zh_xuan13 小时前
Android gradle任务
android·gradle构建
Grackers14 小时前
Android Perfetto 系列 10:Binder 调度与锁竞争
android·binder
李白你好14 小时前
Android 自动化渗透测试指令生成
android·自动化
CeshirenTester15 小时前
Claude Code 不只是会写代码:这 10 个 Skills,才是效率分水岭
android·开发语言·kotlin
朝星16 小时前
Android开发[2]:Flow
android·kotlin