使用 MVI 开发响应式 APP — 第三部分 — 状态折叠器(state reducer)
在前面的系列里 我们已经讨论了如何用 Model-View-Intent 模式和单向数据流去实现一个简单的页面。在这篇博客里我们将要实现更加复杂页面,这个页面将有助于我们理解状态折叠器(state reducer)。
如果你没读第二部分,你应该先去读一下第二部分,然后再读这篇博客, 因为第二部分博客描述我们如何将业务逻辑通过 Presenter 与 View 进行沟通,如果让数据进行单向流动。
现在我们构建一个更加复杂的场景,像下面演示的内容:
正如你所见,上面的演示内容,就是根据不同的类型显示商品列表。这个 APP 中每个类型只显示三个项,用户可以点击加载更多,来加载更多的商品(http请求)。另外,用户可以使用下拉刷新去更新不同类型下的商品,并且,当用户加载到最底端的时候,可以加载更多类型的商品(加载下一页的商品)。当然,当出现异常的时候,所有的这些动作执行过程与正常加载时候类似,只不过显示的内容不同(例如:显示网络错误)。
让我们一步一步实现这个页面。第一步定义View的接口。
public interface HomeView {
/**
- 加载首页意图
- @return 发射的值可以被忽略,无论true或者false都没有其他任何不一样的意义
*/
public Observable loadFirstPageIntent();
/**
- 加载下一页意图
- @return 发射的值可以被忽略,无论true或者false都没有其他任何不一样的意义
*/
public Observable loadNextPageIntent();
/**
- 下拉刷新意图
- @return 发射的值可以被忽略,无论true或者false都没有其他任何不一样的意义
*/
public Observable pullToRefreshIntent();
/**
- 上拉加载更多意图
- @return 返回类别的可观察对象
*/
public Observable loadAllProductsFromCategoryIntent();
/**
- 渲染
*/
public void render(HomeViewState viewState);
}