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 小时前
在 Android 上跑大模型,你选错引擎了吗?
android
studyForMokey3 小时前
【Android面试】View绘制流程专题
android·面试·职场和发展
jjinl5 小时前
Android 资源说明
android
恋猫de小郭7 小时前
Swift 6.3 正式发布支持 Android ,它能在跨平台发挥什么优势?
android·前端·flutter
一只会跑会跳会发疯的猴子7 小时前
php操作ssl,亲测可用
android·php·ssl
simplepeng8 小时前
MVI with Jetpack Compose:让你的应用更简洁和整洁
android jetpack
simplepeng8 小时前
别再让团队困惑:少有人提及的 MVI 命名规范
android jetpack
程序员码歌8 小时前
火爆了,一个Skill搞定AI热点自动化:RSS 聚合 + AI 筛选 + 公众号 + 邮件全流程
android·前端·ai编程
优选资源分享8 小时前
小白转文字 v1.2.8.0 | 安卓离线免费音视频转写工具
android·音视频