我有一个我用来登录的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")
}
}
}
}
}
....
}
我怎样才能将保存和加载保存的用户凭据的逻辑移动到视图模型中,并避免所有这些冗余?