我想知道从ViewModel在视图中显示某种消息的最佳方法是什么。我的ViewModel正在进行POST调用,“ onResult”我想向包含特定消息的用户弹出一条消息。
这是我的ViewModel:
public class RegisterViewModel extends ViewModel implements Observable {
.
.
.
public void registerUser(PostUserRegDao postUserRegDao) {
repository.executeRegistration(postUserRegDao).enqueue(new Callback<RegistratedUserDTO>() {
@Override
public void onResponse(Call<RegistratedUserDTO> call, Response<RegistratedUserDTO> response) {
RegistratedUserDTO registratedUserDTO = response.body();
/// here I want to set the message and send it to the Activity
if (registratedUserDTO.getRegisterUserResultDTO().getError() != null) {
}
}
});
}
我的活动:
public class RegisterActivity extends BaseActivity {
@Override
protected int layoutRes() {
return R.layout.activity_register;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
ActivityRegisterBinding binding = DataBindingUtil.setContentView(this, layoutRes());
binding.setViewModel(mRegisterViewModel);
}
在这种情况下最好的方法是什么?
答案 0 :(得分:4)
我们可以使用 SingleLiveEvent 类作为解决方案。但这是一个LiveData,只会发送一次更新。 以我个人的经验,将Event Wrapper类与MutableLiveData一起使用是最好的解决方案。
这是一个简单的代码示例。
第1步: 创建一个Event类。(这是您可以在任何android项目中重复使用的样板代码)
open class Event<out T>(private val content: T) {
var hasBeenHandled = false
private set // Allow external read but not write
/**
* Returns the content and prevents its use again.
*/
fun getContentIfNotHandled(): T? {
return if (hasBeenHandled) {
null
} else {
hasBeenHandled = true
content
}
}
/**
* Returns the content, even if it's already been handled.
*/
fun peekContent(): T = content
}
第2步: 在View Model类的顶部,使用wrapper定义MutableLiveData(我在这里使用了String,可以使用所需的数据类型),以及用于封装的相应实时数据。
private val statusMessage = MutableLiveData<Event<String>>()
val message : LiveData<Event<String>>
get() = statusMessage
第3步: 您可以像这样使用ViewModel的功能更新状态消息。
statusMessage.value = Event("User Updated Successfully")
第4步:
编写代码以从View(活动或片段)观察实时数据
yourViewModel.message.observe(this, Observer {
it.getContentIfNotHandled()?.let {
Toast.makeText(this, it, Toast.LENGTH_LONG).show()
}
})
答案 1 :(得分:3)
使用 LiveData 从视图模型在视图中显示某种消息。
步骤:
例如:
在Viewmodel中:
var status = MutableLiveData<Boolean?>()
//In your network successfull response
status.value = true
在您的活动或片段中:
yourViewModelObject.status.observe(this, Observer { status ->
status?.let {
//Display Toast or snackbar
}
})