Android开发中如何检查DataStore是否已存储用户数据
实现方案
判断DataStore中是否存在已存储的用户数据,不要依赖现有Flow返回的默认值(默认空串、0可能和业务合法值冲突导致误判),直接使用Preferences类自带的contains()方法检查对应存储key是否存在即可。因为你的storeUser方法是同时写入用户名、用户编号两个key,只要任意一个key存在,就代表已经存储过用户数据。
可选实现方式
你可以根据自己的业务场景选择,也可以两种都加:
- 单次挂起判断:适合启动页、路由判断这种只需要查一次当前状态的场景
- 状态流监听:适合需要实时响应用户数据变化的场景(比如用户退出登录清空数据后自动跳转登录页)
新增代码示例
在类中新增以下成员即可:
/** * 单次获取当前是否存在已存储的用户数据 * 挂起函数,需要在协程或协程作用域中调用 */ suspend fun hasStoredUser(): Boolean { // 取当前最新的偏好配置,仅获取一次 val currentPreferences = dataStore.data.first() return currentPreferences.contains(USER_NAME_KEY) || currentPreferences.contains(USER_NUMBER_KEY) } /** * 持续监听用户数据存储状态的Flow * 存储数据、清空数据时会自动推送最新的布尔结果 */ val hasStoredUserFlow: Flow<Boolean> = dataStore.data.map { preferences -> preferences.contains(USER_NAME_KEY) || preferences.contains(USER_NUMBER_KEY) }
配套建议
如果你后续需要做退出登录清空用户数据的逻辑,建议配套新增清空方法,保证判断逻辑准确:
suspend fun clearUser() { dataStore.edit { mutablePreferences -> mutablePreferences.remove(USER_NAME_KEY) mutablePreferences.remove(USER_NUMBER_KEY) } }
修改后的完整UserManager类
class UserManager(context: Context) { private val dataStore = context.createDataStore(name = "user_prefs") companion object { val USER_NAME_KEY = preferencesKey<String>("USER_NAME") val USER_NUMBER_KEY = preferencesKey<Int>("USER_NUMBER") } suspend fun storeUser(number: Int, name: String) { dataStore.edit { it[USER_NUMBER_KEY] = number it[USER_NAME_KEY] = name } } suspend fun hasStoredUser(): Boolean { val currentPreferences = dataStore.data.first() return currentPreferences.contains(USER_NAME_KEY) || currentPreferences.contains(USER_NUMBER_KEY) } val hasStoredUserFlow: Flow<Boolean> = dataStore.data.map { it.contains(USER_NAME_KEY) || it.contains(USER_NUMBER_KEY) } suspend fun clearUser() { dataStore.edit { it.remove(USER_NAME_KEY) it.remove(USER_NUMBER_KEY) } } val userNumberFlow: Flow<Int> = dataStore.data.map { it[USER_NUMBER_KEY] ?: 0 } val userNameFlow: Flow<String> = dataStore.data.map { it[USER_NAME_KEY] ?: "" } }
使用示例
- 单次判断(协程中调用):
// 比如在ViewModel中 viewModelScope.launch { val isUserExist = userManager.hasStoredUser() if (isUserExist) { // 跳转至主页 } else { // 跳转至登录页 } }
- 持续监听状态:
// 比如在Activity/Fragment中 lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { userManager.hasStoredUserFlow.collect { isUserExist -> // 根据最新状态更新UI、处理页面跳转 } } }
内容的提问来源于stack exchange,提问作者Ashish Gautam
相关产品推荐
相关产品推荐

