修改下之前的代办事项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. 还是深色模式,状态记住了。