数据绑定-MediatorLiveData无法在Fragment

时间:2019-05-24 14:43:43

标签: android kotlin android-databinding android-livedata

片段中的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

我正在导入此viewModel,如下所示:

  <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没有被调用的问题

2 个答案:

答案 0 :(得分:0)

依次检查这些步骤:

1)更改此:

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

对此(请注意附加的等号):

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

有关2向数据绑定here

的更多信息

2)检查是否在XML布局中添加了正确的viewmodel绑定:

enter image description here

3)检查代码绑定,将绑定代码更改为此:

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

答案 1 :(得分:0)

虽然这篇文章没有遇到我遇到的问题,但对我有帮助的一件事:

如果您有一个返回实时数据的函数,例如fun myName():LiveData { 返回myLiveName }

视图模型绑定将不会在xml布局中显示值。实时数据必须是变量,而不是功能,例如: val myNameVariable:LiveData = myName()