使用 Android Observer/Livedata/Coroutine/Kotlin 实现 Redux

Mik*_*e76 5 android kotlin reactjs redux react-redux

考虑 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 数据类,因为它们不应该包含任何逻辑。
  • 在商店内,实现一个 Kotlin 协程,从队列中获取操作并使用一个巨大的 switch 语句来调度它们。
  • 使用房间数据库+一些短暂状态作为模型。特别是,短暂状态控制在任何给定时间显示哪个片段/对话框。
  • 确保状态仅由协程改变。
  • 每当 Room 数据库或临时状态发生变化时,使用 observable livedata ( androidx.lifecycle.LiveData) 重新渲染 UI。
  • 由于可观察量不足以控制 Android UI,因此我还需要一个函数来将当前片段/活动与预期状态进行比较,例如,如果检测到偏差则触发 FragmentManager 事务。

但有几点尚不清楚:

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

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

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

Dav*_*son 0

你说 MVVM 有一些限制是对的。

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

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

平均接收率

莫斯比

此外,此摘要页面 还有描述该方法的文章/库列表。