何时使用MutableLiveData和LiveData

时间:2019-04-30 05:59:24

标签: android android-architecture-components android-livedata

何时使用MutableLiveDataLiveData表示使用方法的范围:

MutableLiveData<User> getUser() {
    if (userMutableLiveData == null) {
        userMutableLiveData = new MutableLiveData<>();
    }
    return userMutableLiveData;
}

以及何时使用它

LiveData<User> getUser() {
    if (userMutableLiveData == null) {
        userMutableLiveData = new MutableLiveData<>();
    }
    return userMutableLiveData
}

7 个答案:

答案 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 中的 MutableListList 一样。当您希望修改其数据或希望为其重新分配新值时,请使用 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

        })