何时使用MutableLiveData
和LiveData
表示使用方法的范围:
MutableLiveData<User> getUser() {
if (userMutableLiveData == null) {
userMutableLiveData = new MutableLiveData<>();
}
return userMutableLiveData;
}
以及何时使用它
LiveData<User> getUser() {
if (userMutableLiveData == null) {
userMutableLiveData = new MutableLiveData<>();
}
return userMutableLiveData
}
答案 0 :(得分:1)
假设您正在遵循 MVVM体系结构,并且将LiveData
作为从ViewModel
到您的Activity
的可观察模式。这样您就可以将变量作为LiveData
对象暴露给Activity
,如下所示:
class MyViewModel : ViewModel() {
// LiveData object as following
var someLiveData: LiveData<Any> = MutableLiveData()
fun changeItsValue(someValue: Any) {
(someLiveData as? MutableLiveData)?.value = someValue
}
}
现在在Activity
部分,您可以观察到LiveData
,但是对于修改,您可以像下面这样从ViewModel
调用方法:
class SomeActivity : AppCompatActivity() {
// Inside onCreateMethod of activity
val viewModel = ViewModelProviders.of(this)[MyViewModel::class.java]
viewModel.someLiveData.observe(this, Observer{
// Here we observe livedata
})
viewModel.changeItsValue(someValue) // We call it to change value to LiveData
// End of onCreate
}
答案 1 :(得分:1)
LiveData
没有公共可用的方法来更新存储的数据。 MutableLiveData
类将 setValue(T)
和 postValue(T)
方法公开,如果您需要编辑存储在 LiveData
对象中的值,则必须使用这些方法。通常在 MutableLiveData
中使用 ViewModel
,然后 ViewModel
只向观察者公开不可变的 LiveData
对象。
请看看这个reference。
答案 2 :(得分:0)
我们应该返回LiveData,以防止视图(或其他观察者)发生意外值修改。
具有:
LiveData<User> getUser() {
if (userMutableLiveData == null) {
userMutableLiveData = new MutableLiveData<>();
}
return userMutableLiveData
您不能在您的活动/片段中写:getUser().setValue(...)
。这使您的代码不易出错。
答案 3 :(得分:0)
LiveData没有公共方法来修改其数据。
LiveData<User> getUser() {
if (userMutableLiveData == null) {
userMutableLiveData = new MutableLiveData<>();
}
return userMutableLiveData
}
您无法更新其值,例如getUser().setValue(userObject)
或getUser().postValue(userObject)
因此,当您不希望修改数据时,请使用LiveData
如果以后要修改数据,请使用MutableLiveData
答案 4 :(得分:0)
当您不想修改它时,请使用 LiveData ,因为 setValue()和 postValue()之类的方法不是公开的。实时数据通过内部调用来照顾自己。
与MutableLiveData中一样, setValue() postValue()是公开的,您可以通过调用这些方法来更改设置值。
在此处查找更多详细信息: https://blog.mindorks.com/livedata-setvalue-vs-postvalue-in-android
答案 5 :(得分:0)
在单独的类中使用 MutableLiveData 的最佳方法 喜欢
public class SharedViewModel extends ViewModel {
private MutableLiveData<CharSequence>text = new MutableLiveData<>();
public void setText(CharSequence input)
{
text.setValue(input);
}
public LiveData<CharSequence> getText(){
return text;
}
}
Livedata 用于 Fragment Like
private SharedViewModel viewModel;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//No Need to initate further
viewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
viewModel.getText().observe(getViewLifecycleOwner(), new Observer<CharSequence>() {
@Override
public void onChanged(@Nullable CharSequence charSequence) {
editText.setText(charSequence);
}
});
}
在片段类中就像
public class FragmentA extends Fragment {
private SharedViewModel viewModel;
private EditText editText;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_a, container, false);
editText = v.findViewById(R.id.edit_text);
Button button = v.findViewById(R.id.button_ok);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModel.setText(editText.getText());
}
});
return v;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
viewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
viewModel.getText().observe(getViewLifecycleOwner(), new Observer<CharSequence>() {
@Override
public void onChanged(@Nullable CharSequence charSequence) {
editText.setText(charSequence);
}
});
}
}
答案 6 :(得分:0)
为了最佳实践,可读性并避免容易出错,就像 Kotlin 中的 MutableList
与 List
一样。当您希望修改其数据或希望为其重新分配新值时,请使用 Mutable。
当我们想要使其值可写或可以随时更改时,我们使用 MutableLiveData
。
当我们只想阅读和收听 LiveData
所做的任何更新时,我们会使用 MutableLiveData
。因此我们有这样的代码作为示例
private var filterAsset = MutableLiveData<String>().apply{
value = "Empty"
}
//public method to set a new value on filterAsset
fun setFilterData(assetName: String){
filterAsset.value = assetName
}
// We can use this to listen on any updates from filterAsset
val assetFilterUpdates: LiveData<String> = filterAsset
// Inside your Fragment/Activity
// You can listen to the update in Fragment or Activity like this
yourViewModel.assetFilterUpdates.observe(viewLifecycleOwner, { value ->
// Use the updated value here
})