【问题标题】:Android Architecture Components, android binding and LiveDataAndroid 架构组件、android 绑定和 LiveData
【发布时间】:2017-08-08 20:09:17
【问题描述】:

我想知道 android 绑定是否与概念级别的实时数据兼容。 有一个简单的任务:单击按钮后调用服务器。 所以在我看来我有

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

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

【问题讨论】:

  • 我不会将onOrderButtonClick() 放在视图模型上。恕我直言,这是控制器或演示者操作,而不是视图模型操作。
  • @CommonsWare,我认为当您使用 android 绑定时,这是唯一的选择
  • 没有。你可以绑定任何你想要的对象。如果您想绑定一个视图模型(用于填充小部件,并且可能用于通过双向绑定接收输出)和一个控制器/演示器对象(用于事件),欢迎您这样做。只需在布局中定义两者并为两者调用相应的set...() 方法即可。
  • @CommonsWare,你能给我举个例子吗?据我了解,我可以使用android绑定来实现视图和视图模型之间的双向绑定,但是要使用事件(在这种情况下为onclick),我仍然需要在片段或活动中调用findViewById()......
  • 无论如何 - 我知道它是可能的,但是使用 pue android 绑定架构很简单 - 我只是在 ViewModel 中定义了 onClick() 方法,并且在那里我直接修改了 Observable 字段并且视图正在更新。使用 LiveData,我必须为每个 UI 事件调用 observe(),然后在视图模型中调用 setValue()。然后在片段类的 onChange() 方法中,我必须回调视图模型以更改可观察字段。这似乎不是很清楚和简单。这就是为什么我问这个问题那里的概念是什么

标签: android android-architecture-components android-livedata


【解决方案1】:

经过一番挖掘,有一个坏消息和一个好消息。 坏消息是无论如何都必须使用片段(片段中总是有一些代码用于每个 livedata 事件) 好处是可以做的比较干净:

  1. 从片段调用 getOrderObservable() 到视图模型。它返回 在视图模型的 ctor 中创建的 MutableLiveData。
  2. 然后在该 observable 视图模型的 onOrderButtonClick() 上调用 observable()
  3. 在视图模型的 onOrderButtonClick() 中调用 setValue()

    在我看来,该解决方案最大限度地减少了片段中的代码量。将网络调用和结果处理分开看起来还是不太优雅

【讨论】:

  • - 我可以请您再解释一下吗?我也一直在试图弄清楚 Databinding、Livedata、ViewModel 如何协同工作并仍然保持 MVVM 架构。其中一个大难题是 onclick - 我如何启动新意图等。如果您能解释一下您的发现,那就太好了。
  • @Sandeep - 请更具体
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多