与Android MVVM协同工作
我需要在MVVM模式上实现与Android MVVM协同工作,android,kotlin,mvvm,coroutine,Android,Kotlin,Mvvm,Coroutine,我需要在MVVM模式上实现Kotlin协程,我尝试在ViewModel上使用actors来测试这一点,问题是我不知道如何正确地使用它。 我知道我需要从actoroffer/send方法中的视图发送调用,但是如何控制它呢?我需要为每个viewmodel创建每个密封类 演员: private val gradeActor = viewModelScope.actor<ActorCommand<String>>(Dispatchers.Main) { for (
Kotlin协程
,我尝试在ViewModel
上使用actors
来测试这一点,问题是我不知道如何正确地使用它。
我知道我需要从actoroffer/send
方法中的视图发送调用,但是如何控制它呢?我需要为每个viewmodel创建每个密封类
演员:
private val gradeActor = viewModelScope.actor<ActorCommand<String>>(Dispatchers.Main) {
for (command in channel) {
when (command) {
is ActorCommand.REGISTER -> {
// do
}
}
}
}
对于LoginViewModel,我使用:
sealed class TwoFaCommand {
class VERIFY(val code: String, val sessionId: String) : TwoFaCommand()
class CONFIRM(val secretKey: String, val manualCode: String, val code: String) : TwoFaCommand()
class SAVE(val secretKey: String, val manualCode: String, val code: String) : TwoFaCommand()
}
sealed class LoginCommand {
class LOGIN(val email: String, val password: String) : LoginCommand()
class LOGIN_VALIDATE(val email: String, val password: String) : LoginCommand()
class SAVE_USER_DATA(val email: String, val password: String) : LoginCommand()
object USER_IV : LoginCommand()
}
参与者调用时(LoginViewModel):
private val eventActor=viewModelScope.actor(Dispatchers.Main、Channel.RENDEZVOUS){
for(通道中的命令){
何时(命令){
是LoginCommand.LOGIN->{
loadingStateLiveData.postValue(true)
loginLiveData.postValue(loginRepository.getLogin(Login(command.email,command.password)))
loadingStateLiveData.postValue(false)
}
是LoginCommand.SAVE\u USER\u DATA->{
loginSavedRepository.saveUserData(command.email、command.password)
}
}
}
}
真的有必要为每个viewmodel和通道通信创建一个密封的类吗?(就像我正在做的那样)
sealed class LoginCommand {
class LOGIN(val email: String, val password: String) : LoginCommand()
class LOGIN_VALIDATE(val email: String, val password: String) : LoginCommand()
class SAVE_USER_DATA(val email: String, val password: String) : LoginCommand()
object USER_IV : LoginCommand()
}
private val eventActor = viewModelScope.actor<LoginCommand>(Dispatchers.Main, Channel.RENDEZVOUS) {
for (command in channel) {
when (command) {
is LoginCommand.LOGIN -> {
loadingStateLiveData.postValue(true)
loginLiveData.postValue(loginRepository.getLogin(Login(command.email, command.password)))
loadingStateLiveData.postValue(false)
}
is LoginCommand.SAVE_USER_DATA -> {
loginSavedRepository.saveUserData(command.email, command.password)
}
}
}
}