Как предотвратить сброс значения, сохраненного в хранилище данных настроек, при перезапуске приложения?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как предотвратить сброс значения, сохраненного в хранилище данных настроек, при перезапуске приложения?

Сообщение Anonymous »

Каждый раз, когда я перезапускаю приложение, значения, сохраненные в хранилище данных настроек, сбрасываются.
В частности, я пытаюсь сохранить, выбрал ли пользователь светлый или темный режим для своего приложения. предпочтительная фоновая тема. Однако он не сохраняется при перезапуске приложения.
Я использую логическое значение для определения фоновой темы, а затем сохраняю ее с помощью хранилища данных настроек.
Вот класс хранилища данных, который используется для доступа к значению:

Код: Выделить всё

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
}
}
}
Ниже приведен код Compose в основной активности.
Это экземпляр ThemeDatastore. В поле параметра контекста указан текущий локальный контекст:

Код: Выделить всё

val themeDatastore = ThemeDatastore(LocalContext.current)
Вот переменная, которая извлекает предпочтительную фоновую тему. Изначально установлено значение false:

Код: Выделить всё

val savedTheme = themeDatastore.loadTheme(key = themeDatastore.themeKey).collectAsState(initial = false)
Вот логическая переменная, определяющая тему фона. Если false, активен светлый режим, если true, активен темный режим. Изначально установлено значение false:

Код: Выделить всё

var isDarkModeActive by remember { mutableStateOf(false) }
Вот функция, которая вызывает функцию из ThemeDatastore, которая сохраняет предпочтительную фоновую тему:

Код: Выделить всё

fun saveTheme(){
CoroutineScope(Dispatchers.IO).launch {
themeDatastore.saveTheme(themeDatastore.themeKey, isDarkModeActive)
}
}
Вот макет приложения. Это поле, занимающее весь экран. Цвет фона становится темно-серым, если значения isDarkModeActive и saveTheme.value равны true:

Код: Выделить всё

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")
}
}
В центре экрана находится кнопка. При нажатии кнопки isDarkModeActive переключается между true и false и срабатывает функция saveTheme.
Я попробовал установить начальное значение переменной saveTheme на истинный. Это не сработало.

Подробнее здесь: https://stackoverflow.com/questions/787 ... when-the-a
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»