1

我有一个用于登录的 ViewModel。

第一次登录时,我将用户名和密码保存到 DataStore(来自主 ActivityContext)

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

我认为当我只在 ViewModel 中使用它时从 MainActivity 管理我的 DataStore 时内聚力太低,而且我必须从我认为不需要的冗余 StateFlow 中进行大量不必要的收集。

我的视图模型有一个功能,如果登录成功login(),它会将用户添加到视图模型的user状态(这用于 mainactivity wo 监听该状态的更新)

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)
        }
    }
    ...
}

我的主要活动

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")
                    }
                }
            }
        }
    }
    ....
}

如何将保存和加载保存的用户凭据的逻辑移动到视图模型中并避免所有这些冗余?

4

0 回答 0