一次性事件的LiveDataBuilder



在Android文档中,我发现了这篇关于条件导航的文章,其中登录函数返回LiveData,将signIn结果从视图模型传播回片段。我假设viewModel使用LiveDataBuilder创建LiveData

//Fragment
fun login(username: String, password: String) {
userViewModel.login(username, password).observe(viewLifecycleOwner, Observer { result ->
if (result.success) {
savedStateHandle.set(LOGIN_SUCCESSFUL, true)
findNavController().popBackStack()
} else {
showErrorMessage()
}
})
}

我想viewmodel是这样做的。

fun login(username: String, password: String) = liveData {
//perform login
}

我一直认为这是一种糟糕的做法,因为它在每次登录时都会创建一个Livedata对象。在这种情况下,我主要使用另一个SingleLiveData对象来发布登录结果。我也经常使用回调。类似这样的东西:

fun login(username: String, password: String) {
userViewModel.login(username, password, 
onSuccess = {
//DO SOMETHING
}, onError = {
//DO SOMETHING
})
}

有人能解释一下现在哪种方法是最好的吗?不应该使用其他学徒的原因是什么?

您不能以这种方式使用回调。您正在将视图泄漏到ViewModel。

以这种方式使用的LiveData基本上是一个美化的回调,当Fragment的视图超出范围时,它将自动取消,因此更容易在Fragment上安全使用,并避免将Fragment泄漏到ViewModel。它为您节省了大量的样板,这些样板是安全地进行操作所必需的,并且不会泄漏Fragmet。

我一直认为这是一种糟糕的做法,因为它在每次登录时都会创建一个Livedata对象。

我看不出这有什么不好。这是一个重量轻的物体。可能比你在应用程序中使用的大多数字符串更轻。

最新更新