为什么LiveData不更新?(Android, Kotlin)

问题描述 投票:0回答:1

如何将MutableLiveData暴露为LiveData?

下面的代码不能使用。

SimpleMixerFragment.kt.SimpleMixerViewModel。

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}"/>
android kotlin
1个回答
1
投票

@{} 注册了一个单向绑定,这意味着如果你修改了 MutableLiveData 的代码,那么它就会将这些变化传播到 EditText.

@={} 注册了双向绑定,这意味着如果你修改了 MutableLiveDataandroid:text 属性,然后它将更新 MutableLiveData -> android:textandroid:text -> MutableLiveData (以被修改的为准)。

要使用双向绑定,你必须暴露LiveData的可变版本,以便绑定可以将EditText的新值写入MutableLiveData中。

© www.soinside.com 2019 - 2024. All rights reserved.