如何将MutableLiveData公开为LiveData?

下面的代码不起作用。

SimpleMixerFragment.kt

private lateinit var binding: MixerSimpleFragmentBinding
private lateinit var viewModel: SimpleMixerViewModel

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

    // Inflate view and obtain an instance of the binding class
    binding = DataBindingUtil.inflate(
        inflater,
        R.layout.mixer_simple_fragment,
        container,
        false
    )

    viewModel = ViewModelProvider(this).get(SimpleMixerViewModel::class.java)

    binding.simpleMixerViewModel = viewModel

    binding.lifecycleOwner = viewLifecycleOwner

    return binding.root
}

SimpleMixerViewModel.kt
class SimpleMixerViewModel : ViewModel() {

   private val _etDate = MutableLiveData<String>()
   val etDate: LiveData<String>
       get() = _etDate
}

mixer_simple_fragment.kt
<variable name="simpleMixerViewModel" type="....SimpleMixerViewModel" />

<com.google.android.material.textfield.TextInputEditText
                                android:id="@+id/etDate"
                                android:text="@{simpleMixerViewModel.etDate}"/>

这可以代替。

SimpleMixerViewModel.kt
class SimpleMixerViewModel : ViewModel() {

   val etDate = MutableLiveData<String>()
}

mixer_simple_fragment.xml
<variable name="simpleMixerViewModel" type="....SimpleMixerViewModel" />

<com.google.android.material.textfield.TextInputEditText
                                android:id="@+id/etDate"
                                android:text="@={simpleMixerViewModel.etDate}"/>

最佳答案

@{}注册一个单向绑定(bind),这意味着如果您从代码中修改MutableLiveData,那么它将把更改传播到EditText
@={}注册了双向绑定(bind),这意味着如果您修改MutableLiveDataandroid:text属性,则它将更新MutableLiveData -> android:textandroid:text -> MutableLiveData(以修改者为准)。

若要使用双向绑定(bind),必须公开LiveData的可变版本,以便绑定(bind)可以将EditText的新值写入MutableLiveData。

07-25 22:07
查看更多