【问题标题】:How to use preference datastore in Application Class in JetPack Compose Android to Change theme?如何在 JetPack Compose Android 的应用程序类中使用偏好数据存储来更改主题?
【发布时间】:2021-07-18 21:12:44
【问题描述】:

我已经使用 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,然后在onCreate 中使用GlobalScope 来获取preference datastore,在喷气背包组合中更改这样的主题似乎不是最佳做法.

我的问题是,使用 jetPack Compose 中的应用程序类获取存储值和更改主题的首选方式是什么。

【问题讨论】:

    标签: android kotlin coroutine android-jetpack preferences


    【解决方案1】:

    编辑2021 年 8 月,使用 compose 1.0.1 测试

    要获得一个按钮/开关来更改主题并将其作为设置持久化,您可以使用Jetpack DataStore(推荐)或SharedPreferences,在 MainActivity 中获取您的主题状态并将其传递给您的 Theme 可组合,以及任何地方你想修改它。

    您可以在此 GitHub repo 中找到带有 SharedPreferences 的完整工作示例。

    此示例使用 SingletonHilt 作为依赖项,适用于您要存储的所有首选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 2022-07-17
      • 1970-01-01
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多