0

我已将我的应用程序从 using 切换SharedPreferencesPreferencesDataStore. 我还在我的应用程序中实现了暗模式和几个主题。对于主题,我基本上在每个活动中都依赖此代码:

    val themePreferences = getSharedPreferences("THEME_PREFERENCES", MODE_PRIVATE)
    val settingsPreferences = getSharedPreferences("SETTINGS_PREFERENCES", MODE_PRIVATE)
    darkMode = settingsPreferences.getBoolean("darkMode", false)

    setTheme(when (darkMode) {
        true -> themePreferences.getInt("themeDark", R.style.AppThemeDark)
        false -> themePreferences.getInt("themeLight", R.style.AppThemeLight)
    })

选定的主题被存储为一个整数,每个主题用于浅色模式和深色模式。现在,我也想采用我的代码的这一部分。我从我的 dataStore 存储库中获取了 darkMode 布尔值,如下所示:

viewModel.storedDarkMode.observe(this) { darkMode = it }

如果我在 LiveData 对象的 observe(this) { ... } 内工作,它将无法工作。

现在,如何将上面显示的代码片段更改为PreferencesDataStore?或者实际上是否更好,例如创建一个单独的类以便从那里观察值?如果是的话,那样的东西怎么可能呢?或者你知道一些遵循 Android 架构的很好的示例代码,包括我可以查看的带有暗模式的自定义主题吗?

我仍在学习很多东西,非常感谢任何有助于更好地理解这一点的帮助!

最好的问候,马库斯

编辑

runBlocking {
        val darkMode = viewModel.darkModeFlow.first()
        setTheme(when (darkMode) {
            true -> viewModel.themeDarkFlow.first()
            false -> viewModel.themeLightFlow.first()
        })
    }
4

1 回答 1

0

我不知道这是否是最佳实践,但我用来runBlockingdataStore. 始终建议我们永远不要runBlocking在生产代码中使用。

val preferences = runBlocking {
    mainActivityViewModel.preferencesFlow.first()
}
setAppTheme(preferences.currentTheme)
binding = ActivityMainBinding.inflate(layoutInflater)

setAppTheme方法

private fun setAppTheme(theme: Boolean) {
        mainActivityViewModel.darkMode = theme
        //set your theme here
    }

现在观察preferencesFlow主题值的任何变化,如果主题发生变化,那么recreate()

mainActivityViewModel.preferencesLiveData.observe(this) {
        if (it.currentTheme != mainActivityViewModel.selectedTheme) {
            recreate()
        }
    }

因为我们无法加载我们的 UI,而没有获取主题。使用它似乎是正确的runBlocking

于 2021-09-29T13:15:32.477 回答