【发布时间】: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