Почему LiveData не обновляется? (Android, Kotlin) - PullRequest
1 голос
/ 30 апреля 2020

Как выставить 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}"/>

1 Ответ

1 голос
/ 30 апреля 2020

@{} регистрирует одностороннюю привязку, что означает, что если вы измените MutableLiveData из кода, то это распространит изменения в EditText.

@={}, регистрирующие двустороннюю привязку Это означает, что если вы измените либо MutableLiveData ИЛИ android:text свойство, то оно обновит MutableLiveData -> android:text ИЛИ android:text -> MutableLiveData (в зависимости от того, что было изменено).

Чтобы использовать двустороннюю привязку, вы должны выставить изменяемая версия LiveData, чтобы привязка могла записать новое значение EditText в MutableLiveData.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...