片段中的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
没有被调用的问题
答案 0 :(得分:0)
依次检查这些步骤:
1)更改此:
android:text="@{viewModel.nameField}"
对此(请注意附加的等号):
android:text="@={viewModel.nameField}"
有关2向数据绑定here
的更多信息
2)检查是否在XML布局中添加了正确的viewmodel绑定:
3)检查代码绑定,将绑定代码更改为此:
bindingView.apply {
lifecycleOwner = this@InfoFragment
viewModel = this@InfoFragment.viewModel
}
答案 1 :(得分:0)
虽然这篇文章没有遇到我遇到的问题,但对我有帮助的一件事:
如果您有一个返回实时数据的函数,例如fun myName():LiveData { 返回myLiveName }
视图模型绑定将不会在xml布局中显示值。实时数据必须是变量,而不是功能,例如: val myNameVariable:LiveData = myName()