Android 架构组件、Android 绑定和 LiveData

4
我想知道Android Binding在概念层面上是否与LiveData兼容。 有一个简单的任务:在按钮被点击后调用服务器。 因此,在我的视图中,我有:

android:onClick="@{viewmodel::onOrderButtonClick}"

在ViewModel中定义适当的onOrderButtonClick(View)方法。但是为了通过LiveData进行服务器调用,我需要我的Fragment引用(observe()方法需要LifecycleOwner实例作为第一个参数)。 当然,我不能在我的ViewModel中持有对fragment的引用。 这里的模式是什么?我真的需要在片段类中实现所有事件方法并将它们委托回视图模型类吗?


我不会把 onOrderButtonClick() 放在视图模型中。在我看来,那是控制器或者展示器的行为,而不是视图模型的行为。 - CommonsWare
@CommonsWare,我认为当您使用Android绑定时,那是唯一的选择。 - Marcin
不,你可以绑定任何对象。如果你想要绑定一个视图模型(用于填充部件,并可能通过双向绑定接收输出)和一个控制器/Presenter对象(用于事件),你可以这样做。只需在布局中定义两者并为两者调用相应的“set...()”方法即可。 - CommonsWare
@CommonsWare,您能给我演示一个例子吗?从我的理解来看,我可以使用Android绑定来实现视图和视图模型之间的双向绑定,但要使用事件(在这种情况下是onclick),我仍然需要在片段或活动中调用findViewById()... - Marcin
无论如何 - 我知道这是可能的,但使用纯Android绑定,架构很简单 - 我只需在ViewModel中定义onClick()方法,然后直接修改Observable字段,视图就会得到更新。使用LiveData时,我必须为每个UI事件调用observe(),然后在ViewModel中调用setValue()。然后在fragment类的onChange()方法中,我必须回调ViewModel来更改可观察字段。这似乎不是很清晰和简单。这就是为什么我问这个概念是什么的原因。 - Marcin
1个回答

1

经过一番搜索,有一个坏消息和一个好消息。

坏消息是必须仍然使用该片段(对于每个livedata事件,片段中总会有一些代码)。

好消息是可以相对干净地完成:

  1. 从片段调用getOrderObservable()到视图模型。 它返回在视图模型的构造函数中创建的MutableLiveData<>。
  2. 然后在视图模型的onOrderButtonClick()中调用observe()以观察该可观察对象。
  3. 在视图模型的onOrderButtonClick()中只需调用setValue()即可。

    我认为这种解决方案最小化了片段中的代码量。 但仍然不太优雅,无法将网络调用和处理结果分开。


我可以请求您再解释一下吗?我也一直在努力弄清楚数据绑定、Livedata和ViewModel如何共同工作,同时保持MVVM架构。其中一个大难题是onclick - 我该如何启动新的意图等。如果您能解释一下您发现了什么,那就太好了。 - Sandeep
@Sandeep - 请更加具体明确。 - Marcin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接