【问题标题】:Two-way binding with RxJava on AndroidAndroid 上与 RxJava 的双向绑定
【发布时间】:2017-12-20 16:39:40
【问题描述】:

最近我一直在开发一些功能,在我看来,它可以用某种形式的双向绑定很好地建模。

示例:有一个屏幕,用户可以在其中填写一些表格并保存一些内容。稍后用户可以返回该内容并对其进行编辑。内容存储在数据库中,因此应该异步获取内容。我使用 RxJava 和 Mosby MVP 在 Fragment 和 Presenter 之间创建 MVVM 样式的连接。

问题在于表单应该在运行中进行验证,因此任何时候视图的某些部分更改都应该通知 Presenter。但是当来自 DB 的异步内容到达时(如果用户正在编辑现有内容),由于状态之间的转换,视图可能会破坏来自 DB 的“初始”状态。在视图和演示者之间还存在无限事件传递循环的风险(distinctUnitChanged() 并不总是对此有所帮助,因为状态可以像 1-2-1-2-1 一样改变)

我找到了 2 个解决方法,但我对它们不满意,因为它们相当不纯,而且不像惯用的 FRP。

第一个是更改视图,使其在收到演示者的第一个状态之前不发送事件。

第二个需要牺牲 Presenter 的纯度。呈现是设置一个标志,告诉我们是否应该接受视图的状态更改。它会跳过视图中的事件,直到接收到它传递给视图的事件(初始状态)。

事情变得更加困难,因为在 Android 中,视图可以随时断开并重新连接到 Presenter(无论是否保存状态),而 Presenter 应该是事实的来源。

如果有人有任何使用 RxJava 实现双向绑定的示例或任何想法,我将不胜感激。

【问题讨论】:

    标签: android mvvm rx-java two-way-binding


    【解决方案1】:

    在从数据库加载异步内容时考虑使用swichMap()(而不是flatMap()),因为当用户更改表单时,switchMap() 会取消订阅先前的输入验证。

    这可能会解决您的问题。

    顺便说一句。似乎 Mosby MVI 模块更适合作为传统 MVP 来实现您想要实现的目标(RxJava,双向绑定)。

    【讨论】:

    • 我使用 switchMap() 但它不能解决我的问题,因为我的问题是无法立即设置视图状态并且在转换期间视图状态不正确。我很想用别的东西,但为时已晚,而且决定不是我做的。
    猜你喜欢
    • 2022-12-17
    • 2021-05-27
    • 1970-01-01
    • 2020-11-26
    • 2022-11-22
    • 2011-02-16
    • 2016-02-10
    • 2012-07-10
    相关资源
    最近更新 更多