kotlin PreferenceDataStore方法getString()的实现

nxowjjhe  于 2023-01-21  发布在  Kotlin
关注(0)|答案(1)|浏览(99)

我正在使用一个继承PreferenceDataStore的自定义DataStore来存储Android应用程序中设置活动的首选项。我想实现getString()方法,因为PreferenceDataStore.getString()方法不做任何事情。

/**
     * Retrieve a String value from the data store.
     *
     * @param key The name of the preference to retrieve.
     * @param defValue Value to return if this preference does not exist.
     * @see #putString(String, String)
     */
    @Nullable
    default String getString(String key, @Nullable String defValue) {
        return defValue;
    }

这是我的设置首选项类:

class SettingsPreferences(lifecycleCoroutineScope: LifecycleCoroutineScope, context: Context) :
    PreferenceDataStore() {
    companion object {
        private const val TAG = "SettingsPreferences"
        val THEME = stringPreferencesKey("theme")
    }

    private val scope = lifecycleCoroutineScope
    private val currentContext = context

    override fun putString(key: String?, value: String?) {
        scope.launch {
            currentContext.dataStore.edit {
                it[stringPreferencesKey(key.toString())] = value ?: ""
            }
        }
    }

    override fun getString(key: String?, defValue: String?): String? {
        //TODO implement getString
        return super.getString(key, defValue)
    }

    fun storeTheme(theme: String) {
        putString(THEME.name, theme)
    }

}

我不确定使用Kotlin是否有问题,我尝试了以下方法:
currentContext.dataStore.data.first()[stringPreferencesKey(key.toString())]
但是**first()**是一个异步方法,所以我必须挂起 getString() 或者使用协程,但是 getString() 方法是一个继承的方法,不能挂起,使用协程,我不能返回值,我应该为这个方法实现什么或者如何实现?
注:在Android中,有一种替代方法可以通过自定义实现更新Preference屏幕中的值,但这很麻烦,我的目标是实现putString()方法,以便PreferenceFragmentCompat类能够适当地处理它。

rryofs0p

rryofs0p1#

一个可能的选择是使用runblocking,但这更多的是一种变通方法而不是解决方案,因此您可以使用它,并在以后返回到您的任务

相关问题