【发布时间】:2018-02-04 02:58:43
【问题描述】:
Google 表示无法从 ViewModel 观察 LiveData:
[...] 但是 ViewModel 对象绝不能观察到 生命周期感知的可观察对象,例如 LiveData 对象。[...]
我会在 ViewModel 中处理 repo.login() 结果并通知 UI 认为这两个 SingleLiveEvents,这可能吗?
class Repository {
// .... //
fun login(user:String, password:String): LiveData<Status> { /* ... */ }
}
class LoginViewModel : ViewModel() {
@Inject
lateinit var repo: Repository
private var auth = MutableLiveData<User>()
private var showErrorEvent = SingleLiveEvent<String>()
private var showSuccessEvent = SingleLiveEvent<String>()
// Called from UI
fun performLogin(user:User){
repo.login(user.name, user.password)
// We can't observe the result here
// and update error/success events
}
// Called from UI
fun getErrorEvent() = showErrorEvent
// Called from UI
fun getSuccessEvent() = showSuccessEvent
}
【问题讨论】:
-
选项 1:将状态和数据包装在一个类中并公开它:developer.android.com/topic/libraries/architecture/…
-
@JemshitIskenderov,不是这个问题的答案。我想你会包装状态和数据,然后将其公开给 UI,我将处理 ViewModel 中的状态/数据并通过不同的 LiveData (SingleLiveEvent) 通知 UI。此外,您的解决方案假定 UI 会在轮换时更新,因为您应该公开从存储库返回的 LiveData。我会更新一次 UI,这就是我使用 SingleLiveEvent 的原因。
标签: android mvvm kotlin android-architecture-components