在带有 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
递增 11, 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/