android - 在 MVI 中访问 reducer 函数之外的状态

标签 android architecture mosby

在带有 Mosby 库的 MVI 中,访问流中 reducer 函数之外的状态的最佳方法是什么?例如,当您需要为回收站加载下一页时,您需要知道最后加载的是哪一页。 (在示例应用程序中,最后一页保存在加载程序中,但这违背了拥有单一状态 POJO 的全部目的)

最佳答案

有多种方法可以做到这一点,并且根据您的分页 url 的构造方式,您可能根本不需要引用私有(private)状态。

例如,假设您可以通过数字访问下一页。所以 http 请求看起来像这样: http://www.foo.com/feed?page=1 下一页是 http://www.foo.com/feed?page= 2 等等。

然后你基本上可以做这样的事情:

Observable<Integer> nextPageIntent = intent(YourView::loadNextPageIntent)
                                    .scan(1, (previousPage, ignored) -> previousPage + 1);

Observable<State> state = nextPageIntent.switchMap(page -> backend.loadPage(page).map(...) )
                                        .startWith(...)
                                        .onErrorReturn(...);

所以诀窍是添加一些“计数器”。每当触发 YourView::loadNextPageIntent 时,我们都会在 .scan(1, (previousPage, ignored) -> previousPage + 1)page 递增 1。所以这基本上会发出 1, 2, 3, 4, 5, ... 然后从您的后端加载相应的页面。

但是,如果您确实需要对先前状态的引用来确定下一页 url,您可以通过使用 BehaviorSubject 而不是 .scan()< 对状态缩减器进行稍微不同的建模 像这样的运算符 (cretits Paco Estevez ):

BehaviorSubject<State> state = BehaviorSubject.createDefault(initialState);
state.switchMap( oldState ->
        intent(YourView::loadNextPageIntent)
               .switchMap( ignored -> backend.loadPage(oldState.nextPageUrl) // You can access oldState now
                            .map(...))
                            .startWith(...)
                            .onErrorReturn(...)
).subscribe(state);


subscribeViewState(state, YourView::render)

这里的技巧是您使用订阅自身的主题。基本上它与 .scan() 运算符实现 reducer 的操作非常相似,但现在您拥有对旧状态的引用。

关于android - 在 MVI 中访问 reducer 函数之外的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45444255/

相关文章:

java - 持续检查系统中其他模块是否正常工作的模块设计模式?

android - 使用 Mosby 实现非 ViewGroup MVP Android View

android - 如何在android中为自定义按钮实现onkeydown事件

java - 使用 Google Analytics 跟踪变量

android - 如何为选项菜单设置字体?

asp.net-mvc - ASP.NET MVC2 发布到 SSL 和 WCF 服务

ios - 禁用 iOS 系统声音的 AVSystemController 未找到架构 i386 错误

android - MVI架构中的单次事件

android - 使用 RxJava2 和 Retrofit2 Mosby MVI 的 OnErrorNotImplementedException

android - 错误 :Annotation processor '__gen.AnnotationProcessorWrapper_debug_android_databinding_annotationprocessor_ProcessDataBinding' not found