【问题标题】:Implement Redux with Android Observer/Livedata/Coroutine/Kotlin使用 Android Observer/Livedata/Coroutine/Kotlin 实现 Redux
【发布时间】:2020-04-11 01:33:36
【问题描述】:

考虑一下 Google 推荐的 Android 应用架构:https://developer.android.com/jetpack/docs/guide
该架构基于 ViewModels 和 Observables,因此我将其归类为“Model-View-ViewModel”(MVVM)架构。

这与 React-Redux 完全不同。 Android 架构鼓励 View 和 ViewModel 之间的双向数据流,而 Redux 强制循环中的单向数据流。 此外,Android 架构将状态保存在多个 ViewModel 中,而 Redux 强制执行集中式存储。

现在我的问题是如何使用原生 Android 库实现 Redux。 我的第一次尝试是:

  • 将集中式存储实现为 Kotlin Singleton 对象。
  • 商店提供了一个sendAction-方法,该方法执行一个操作,将其放入队列中,然后快速返回。
  • 动作是纯 Kotlin 数据类,因为它们不应包含任何逻辑。
  • 在 store 中,实现一个 Kotlin 协程,从队列中提取动作并使用一个巨大的 switch 语句分派它们。
  • 使用 Room 数据库 + 一些临时状态作为模型。特别是,临时状态控制在任何给定时间显示哪个片段/对话。
  • 确保状态仅由协程改变。
  • 每当 Room-database 或临时状态发生变化时,使用 observable livedata (androidx.lifecycle.LiveData) 重新渲染 UI。
  • 由于 observable 不足以控制 Android UI,我还需要一个将当前片段/活动与预期状态进行比较的函数,例如如果检测到偏差,则触发 FragmentManager 事务。

但是有几点不清楚:

  • 如何使活动/片段与全局状态保持同步?也许我会使用单个活动并根据需要替换片段,具体取决于商店的当前状态。

  • 如何同时实现异步 + 顺序动作调度?也许我会实现一个单独的 Kotlin-Coroutine,它从队列中获取传入的操作并直接在 UI 线程上分派它们。

  • 我们如何确保在分派新操作之前重新渲染整个 UI?也许我会停止调度协程,直到 UI 线程的队列中不再有其他可运行对象?

【问题讨论】:

    标签: android reactjs kotlin redux react-redux


    【解决方案1】:

    您说 MVVM 存在一些限制是对的。

    Redux 风格的架构在 Android 中往往被称为“MVI”或“单向”。

    已经有一些在 Android 中实现此架构的尝试,您可以看看这些尝试来帮助回答您的问题:

    MvRx

    Mosby

    另外,这个summary page 有描述该方法的文章/库列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      • 2020-07-29
      • 2020-03-05
      • 1970-01-01
      相关资源
      最近更新 更多