【发布时间】:2019-10-11 04:36:27
【问题描述】:
我在片段中遇到 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 的问题仍然没有被调用
【问题讨论】:
-
想要达到什么目的?您想在 nameField 更改或 formMediator 时收到通知吗?如果是这样,您是否真的在 formMediator livedata 中添加了一个新值?
-
@Mordag 我想在 nameField 更改时收到通知。我有一个表单和一个提交按钮,在检查表单的最后一个字段之前需要禁用此按钮。所以,基本上我在听这个中介数据,我用 addSource 把我的所有字段都放在里面
-
您可能应该考虑为此使用双向绑定。关于收听更改,我建议使用 ObservableField
对象。此类提供属性更改回调。当然,您也可以使用 livedata,但您需要观察每个相关的 livedata 以获得更改。这对你有意义吗? -
是的,有一点。但在这种情况下,
viewModel.nameField.observe应该开火吧?但事实并非如此。 -
这可能是因为您缺少双向绑定。
标签: android kotlin android-databinding android-livedata