在使用Mosby库的MVI中,访问流中reducer函数之外的状态的最佳方法是什么?例如,当您需要为回收器加载下一页时,您需要知道最后加载了哪个页面。 (在示例应用程序中,最后一页保存在加载程序中,但这违背了拥有单个状态POJO的全部目的)
答案 0 :(得分:2)
有多种方法可以做到这一点,并且根据您的分页网址的构造方式,您可能根本不需要引用私有状态。
例如,让我们说您可以通过号码访问下一页。因此,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(...);
所以诀窍是添加一些&#34;计数器&#34;。每当触发YourView::loadNextPageIntent
时,我们会在page
中将.scan(1, (previousPage, ignored) -> previousPage + 1)
增加一。所以这基本上会发出1, 2, 3, 4, 5, ...
,然后从你的后端加载相应的页面。
但是,如果您确实需要引用之前的状态来确定下一页网址,则可以使用BehaviorSubject
代替.scan()
运算符来对状态缩减器进行略微不同的建模(cretits { {3}}):
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()
运算符实现减速器的方式非常相似,但现在您可以引用旧状态。