gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:12:41 26 4
gpt4 key购买 nike

在带有 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com