привязка данных - MediatorLiveData не запускается внутри фрагмента - PullRequest
1 голос
/ 24 мая 2019

Я столкнулся с некоторыми проблемами с данными MediatorLiveData внутри фрагмента.

Например:

У меня есть View Model:

class InfoPessoalViewModel : NavigationViewModel(){

//fields
val nameField = MutableLiveData<String>()

val formMediator = MediatorLiveData<Boolean>()

init {
    formMediator.addSource(nameField){}
}

И я 'помещаю это имя в мой xml с помощью привязки данных

<EditText
            android:id="@+id/name"
            android:text="@{viewModel.nameField}"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textPersonName" />

Но наблюдатель не запускает мой фрагмент.

bindingView.apply {
            lifecycleOwner = this@InfoFragment
            viewModel = viewModel
        }

        viewModel.formMediator.observe(this, Observer {
            Log.d("Mediator","Fired!")
        })

Кто-нибудь знает, что я здесь не так делаю?

РЕДАКТИРОВАТЬ

Я перешел на двустороннюю привязку здесь

android:text="@={viewModel.nameField}"

Но ничего из этого еще не сработало

    viewModel.nameField.observe(this, Observer {
        Log.d("Livedata","Fired!")
    })

    viewModel.formMediator.observe(this, Observer {
        Log.d("Livedata","Fired!")
    })

РЕДАКТИРОВАТЬ 2

Я импортирую эту модель представления, например:

  <data>
    <variable
        name="viewModel"
        type="br.com.original.bank.sejaoriginal.steps.infopersonal.InfoPessoalViewModel" />
</data>

И связывающее представление внутри моего фрагмента:

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

    bindingView = DataBindingUtil.inflate(inflater,R.layout.fragment_info_pessoal,container,false)

    return bindingView.root
}

РЕДАКТИРОВАТЬ 3

Итак, первоначальная проблема была с viewModel = viewModel, с неправильной ссылкой внутри apply метода.

Но проблема с MediatorLiveData не вызывается до сих пор

1 Ответ

0 голосов
/ 24 мая 2019

Проверьте эти шаги в последовательности:

1) Изменить это:

android:text="@{viewModel.nameField}"

к этому (обратите внимание на дополнительный символ равенства):

android:text="@={viewModel.nameField}"

Подробнее о двусторонней привязке данных здесь

2) Убедитесь, что вы добавили правильную привязку модели представления в макет XML:

enter image description here

3) Проверьте привязку кода, измените код привязки следующим образом:

bindingView.apply {
    lifecycleOwner = this@InfoFragment
    viewModel = this@InfoFragment.viewModel
}
...