android - 如何在 JetPack Compose Android 的应用程序类中使用首选项数据存储来更改主题?

标签 android kotlin coroutine android-jetpack preferences

我已经使用 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然后使用 GlobalScopeonCreate获取 preference datastore并且在喷气背包组合中像这样更改主题似乎不是最佳实践。
我的问题是,在 jetPack Compose 中使用 Application Class 获取存储值和更改主题的首选方式是什么。

最佳答案

编辑 :2021 年 8 月,使用 compose 1.0.1 进行测试
要获得按钮/开关来更改主题并将其作为设置持久化,您可以使用 Jetpack DataStore (推荐)或 SharedPreferences ,在 MainActivity 中获取您的主题状态并将其传递给您的主题组合,以及您想要修改它的任何地方。
您可以通过 SharedPreferences 找到完整的工作示例。在此 GitHub repo .
此示例使用 SingletonHilt对于依赖项,并且对您要存储的所有首选项都有效。

关于android - 如何在 JetPack Compose Android 的应用程序类中使用首选项数据存储来更改主题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67250658/

相关文章:

android - 具有智能卡集成的 phonegap 应用程序

android - Kotlin fragment 类型不匹配

java - 如果不存在则插入整数,如果 Firebase 实时数据库 Android 中已存在则递增

python - 将嵌入式 python asyncio 集成到 boost::asio 事件循环中

android - 包含协程延迟时如何对协程进行单元测试?

android - 无法构建 Android 应用程序 FabricGenerateResourcesDebug

android - 什么是 compileDebugJavaWithJavac 任务?

android - 如何修复 'Unable to determine application id: com.android.tools.idea.run.ApkProvisionException: No outputs for the main artifact of variant:'

kotlin - 在 Kotlin 中,只有 getter 的私有(private)属性和私有(private)函数有什么区别吗?

android - 如何在kotlin中使用协程每秒调用一个函数