我如何存储凭证和访问他们从视图模型

2022-01-28 09:39:27 标签 androidkotlinandroid-mvvmkotlin-stateflow

我有一个我用来登录的ViewModel。

第一次登录,我保存用户名和密码到一个数据存储(从主ActivityContext)

下次打开应用程序时,我将从DataStore加载用户信息,并使用该信息自动登录。

我认为它是太低的内聚,当我管理我的数据存储时,我只在ViewModel中使用它,我必须做很多不必要的收集从冗余的StateFlows,我认为我不需要。

我的视图模型有一个login()函数,如果登录成功,它将把用户添加到视图模型的用户状态(这是在mainactivity中使用的,监听该状态的更新)

class UserViewModel() : ViewModel() {
    private val userRepository = UserRepository()
    private val _token = MutableStateFlow<Resource<Token>>(Resource.Loading())
    val token: StateFlow<Resource<Token>> = _token
    private val _user = MutableStateFlow<Resource<User>>(Resource.Loading())
    val user: StateFlow<Resource<User>> = _user
    fun login(user: User) = viewModelScope.launch {
        _token.value = Resource.Loading()
        _token.value = userRepository.auth(user)
        if (token.value is Resource.Success) {
            _user.value = Resource.Success(user)
        }
    }
    ...
}

我MainActivity

class MainActivity : ComponentActivity() {
    private val viewModel: UserViewModel by viewModels()
    private val Context.userPreferencesDataStore: DataStore<Preferences> by preferencesDataStore(
        name = "user"
    )
    private fun useUser() {
        lifecycleScope.launchWhenStarted{
                viewModel.user.collect{ user ->
                userPreferencesDataStore.edit { ds ->
                    user.data?.let {
                        ds[USER] = setOf(it.username, it.password)
                    }
                }
            }
        }
        lifecycleScope.launchWhenStarted {
            userPreferencesDataStore.data.collect {
                it[USER].let { usr ->
                    if (usr != null) {
                        viewModel.login(User(usr.first(), usr.last()))
                    } else {
                        viewModel.error("No user yet")
                    }
                }
            }
        }
    }
    ....
}

我怎样才能将保存和加载保存的用户凭据的逻辑移动到视图模型中,并避免所有这些冗余?

阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码