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

相关推荐
恋猫de小郭2 小时前
CPF-Flutter 社区提出折叠场景分栏(平行视界) 方案
android·前端·flutter
事圆则缓2 小时前
Java 常用 API 如何建模 Android 订单业务
android
Railshiqian2 小时前
android16单手模式代码走读
android·多屏·单手模式
程序员-珍3 小时前
Android studio 突然打不开
android·java
郑州光合科技余经理11 小时前
国际版外卖系统:税率字段怎么和订单主流程解耦
android·java·开发语言·前端·后端·php·ai编程
andyweike16 小时前
Android Automotive
android
又见情义17 小时前
记一次 RK3568 Android 13 蓝牙反复重启问题的排查与修复
android
hai_android17 小时前
Kotlin Flow combine 源码剖析:一个 Channel 如何优雅合并多条流
android·java·kotlin
敲代码的瓦龙18 小时前
Jetpack?ViewModel!!!
android·开发语言·kotlin·android-studio
Godikov19 小时前
Android 工控终端实战:从秒级卡顿到毫秒响应,SQLite/LitePal 性能优化全记录
android