use*_*266 3 android-toast android-snackbar android-mvvm
我想知道从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) {
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
我的活动:
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);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下最好的方法是什么?
小智 13
我们可以使用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
Run Code Online (Sandbox Code Playgroud)
}
第二步:在你的View Model类的顶部,定义一个MutableLiveDatawith wrapper(我这里使用的是String,但你可以使用你需要的数据类型),以及一个对应的实时数据进行封装。
private val statusMessage = MutableLiveData<Event<String>>()
val message : LiveData<Event<String>>
get() = statusMessage
Run Code Online (Sandbox Code Playgroud)
第 3 步:您可以在如下功能中更新状态消息ViewModel:
statusMessage.value = Event("User Updated Successfully")
Run Code Online (Sandbox Code Playgroud)
第四步 :
编写代码以观察来自View(活动或片段)的实时数据
yourViewModel.message.observe(this, Observer {
it.getContentIfNotHandled()?.let {
Toast.makeText(this, it, Toast.LENGTH_LONG).show()
}
})
Run Code Online (Sandbox Code Playgroud)
在视图模型中使用LiveData在视图模型中显示消息。
步:
例如:
在视图模型中:
var status = MutableLiveData<Boolean?>()
//In your network successfull response
status.value = true
Run Code Online (Sandbox Code Playgroud)
在您的活动或片段中:
yourViewModelObject.status.observe(this, Observer { status ->
status?.let {
//Reset status value at first to prevent multitriggering
//and to be available to trigger action again
yourViewModelObject.status.value = null
//Display Toast or snackbar
}
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3316 次 |
| 最近记录: |