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

相关推荐
爱勇宝10 小时前
我做了一个只用来搜歌词的小 App
android·前端·后端
众少成多积小致巨13 小时前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
Coffeeee20 小时前
如何使用Glide和Coil加载WebP动图
android·kotlin·glide
Kapaseker21 小时前
5 分钟搞懂 Kotlin DSL
android·kotlin
恋猫de小郭21 小时前
AI Agent 开发究竟是啥?如何用 AI 开发 Agent ?深入浅出给你一套概念
android·前端·ai编程
黄林晴1 天前
Android 17 正式发布!target 37 一大批旧代码直接不能用了
android
Carson带你学Android1 天前
Android 17 正式发布:AI 终于成了系统能力
android·前端·ai编程
三少爷的鞋1 天前
当 UseCase 开始长期监听,它可能已经不是 UseCase 了
android
恋猫de小郭1 天前
Android 限制侧载新进展,谷歌联合国内厂商推验证计划
android·前端·flutter
恋猫de小郭1 天前
解读 Android 17 全新内存限制,有没有“豁免”后门?
android·前端·flutter