Android 使用SharedReference存储变量的ViewModel
我使用SharedReference创建了一个对象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
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操作,所以如果需要使用它,我建议移动到后台线程。