Android 使用SharedReference存储变量的ViewModel

Android 使用SharedReference存储变量的ViewModel,android,sharedpreferences,android-viewmodel,Android,Sharedpreferences,Android Viewmodel,我使用SharedReference创建了一个对象 private const val PREF_LOGIN_NAME = "loginName" object LoginPreferences { fun getStoredName(context: Context): String { val prefs = PreferenceManager.getDefaultSharedPreferences(context) return prefs.ge

我使用SharedReference创建了一个对象

private const val PREF_LOGIN_NAME = "loginName"

object LoginPreferences {

    fun getStoredName(context: Context): String {
        val prefs = PreferenceManager.getDefaultSharedPreferences(context)
        return prefs.getString(PREF_LOGIN_NAME, "testExample")!!
    }

    fun setStoredName(context: Context, query: String) {
        PreferenceManager.getDefaultSharedPreferences(context)
            .edit()
            .putString(PREF_LOGIN_NAME, query)
            .apply()
    }
}
然后我将此对象与我的ViewModel一起使用

class LoginViewModel(private val app: Application) : AndroidViewModel(app) {

    val name: String
        get() = LoginPreferences.getStoredName(app)

    fun loginSubmit() {
        LoginPreferences.setStoredName(app, name)
    }
}
LoginViewModel在我的LoginFragment中绑定成功


但是如果我想将其持久保存到SharedReference,我在LoginViewModel中显示的代码对我不起作用。

prefs.getString中的第二个参数。。。方法表示默认值,而不是值本身

prefs.getStringPREF\u LOGIN\u NAME,testExample意味着如果您的共享首选项找不到与指定的键PREF\u LOGIN\u NAME关联的值,它将返回默认值,即testExample

如果要清除共享首选项,可以执行以下操作:

prefs.edit().clear().apply()

然后,如果调用getStoredName。。。第一次,假设您不调用setStoredName,您将得到testExample作为结果。。。在此之前。

如果我绑定LoginSubmit到我的LoginFragment,似乎无法成功保存name变量,可以解释为什么会发生这种情况吗?@ccd是否正在清除共享首选项?如果希望名称保持不变,则除非用户注销,否则不应清除共享pref。是否立即检查共享pref,但该值不存在?您正在使用.apply,这意味着这些值将异步存储。这意味着更改不会立即存储,而是立即使用store.commit来存储,尽管它更昂贵,而且是一个IO操作,所以如果需要使用它,我建议移动到后台线程。