В частности, я пытаюсь сохранить, выбрал ли пользователь светлый или темный режим для своего приложения. предпочтительная фоновая тема. Однако он не сохраняется при перезапуске приложения.
Я использую логическое значение для определения фоновой темы, а затем сохраняю ее с помощью хранилища данных настроек.
Вот класс хранилища данных, который используется для доступа к значению:
Код: Выделить всё
import android.content.Context
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.preferencesDataStore
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
private val Context.dataStore by preferencesDataStore("ThemeDatastore")
class ThemeDatastore(private val context: Context) {
val themeKey = booleanPreferencesKey("Theme")
fun loadTheme(key: Preferences.Key): Flow =
context.dataStore.data.map { preferences ->
preferences[key] ?: false
}
suspend fun saveTheme(key: Preferences.Key, data: Boolean) {
context.dataStore.edit { preferences ->
preferences[key] = data
}
}
}
Это экземпляр ThemeDatastore. В поле параметра контекста указан текущий локальный контекст:
Код: Выделить всё
val themeDatastore = ThemeDatastore(LocalContext.current)
Код: Выделить всё
val savedTheme = themeDatastore.loadTheme(key = themeDatastore.themeKey).collectAsState(initial = false)
Код: Выделить всё
var isDarkModeActive by remember { mutableStateOf(false) }
Код: Выделить всё
fun saveTheme(){
CoroutineScope(Dispatchers.IO).launch {
themeDatastore.saveTheme(themeDatastore.themeKey, isDarkModeActive)
}
}
Код: Выделить всё
Box(
contentAlignment = Alignment.Center,
modifier = Modifier
.background(
color = animateColorAsState(
targetValue = if (isDarkModeActive && savedTheme.value)
Color.DarkGray else Color.White
).value
)
.fillMaxSize(),
) {
Button(onClick = {
isDarkModeActive = !isDarkModeActive
saveTheme()
}) {
Text(text = "Toggle Theme")
}
}
Я попробовал установить начальное значение переменной saveTheme на истинный. Это не сработало.
Подробнее здесь: https://stackoverflow.com/questions/787 ... when-the-a
Мобильная версия