我已经使用 jetpack compose 为我的 android 应用程序设置了主题。我已经在 Application 类( TranslateApplication
)中声明了我的变量
val isDark = mutableStateOf(false)
我在 MainActivity.kt
中使用这个值如 setContent {
JetnewsTheme(darkTheme = translateApplication.isDark.value) { ......
现在我想得到 isDark
使用首选项数据存储,我定义了以下代码。@HiltAndroidApp
class TranslateApplication: Application(){
val android.content.Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = Constants.SETTINGS)
val isDark = mutableStateOf(false)
override fun onCreate() {
super.onCreate()
GlobalScope.launch {
read()
}
}
suspend fun read() {
val dataStoreKey = booleanPreferencesKey(Constants.THEME)
val preferences = dataStore.data.first()
isDark.value = preferences[dataStoreKey] ?: false
}
}
首先,我将值分配给 isDark
然后使用 GlobalScope
在 onCreate
获取 preference datastore
并且在喷气背包组合中像这样更改主题似乎不是最佳实践。我的问题是,在 jetPack Compose 中使用 Application Class 获取存储值和更改主题的首选方式是什么。
最佳答案
编辑 :2021 年 8 月,使用 compose 1.0.1 进行测试
要获得按钮/开关来更改主题并将其作为设置持久化,您可以使用 Jetpack DataStore (推荐)或 SharedPreferences ,在 MainActivity 中获取您的主题状态并将其传递给您的主题组合,以及您想要修改它的任何地方。
您可以通过 SharedPreferences
找到完整的工作示例。在此 GitHub repo .
此示例使用 Singleton
和 Hilt对于依赖项,并且对您要存储的所有首选项都有效。
关于android - 如何在 JetPack Compose Android 的应用程序类中使用首选项数据存储来更改主题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67250658/