在上篇内容的基础上,我们已经可以写一些简单的应用了,但是可以预见到的是,随着页面功能的增多,函数个数、数据与页面的交互也会随之增对,随之而来的就是散落在各处的函数和setState,代码就越来越难维护了。因此需要适当的引入一些设计模式,将界面、数据与逻辑解耦。这里首先提一下MVP。
什么是MVP?
网络上文章很多。。。。。就不重复了。
Flutter上的MVP实践
这里直接拿代码说话,先说说MVP的具体实践,然后举个例子:同一个功能页面切换不同的数据源。
1. 基础MVP结构声明
Dart语言貌似是没有interface的,这里用的是abstract class。
abstract class IView<T> {
setPresenter(T presenter);
}
abstract class IPresenter {
init();
}
2. 声明具体页面的Presenter和View接口
假设我们有一个页面在加载的时候会从web接口获取数据并显示,同时页面可以响应用户的输入,比如上拉加载更多。则从页面行为层面我们可以抽象如下接口:
abstract class DemoPagePresenter implements IPresenter {
// 初始化时候加载第一批数据
void loadData();
// 用户操作加载更多
void loadMore();
}
abstract class DemoPageView implements IView<DemoPagePresenter> {
// 第一批数据加载成功
void onLoadSuccess(data);
// 第一批数据加载失败
void onLoadError();
// 更多数据加载成功
void onLoadMoreSuccess(data);
// 更多数据加载失败
void onLoadMoreError();
}
从这里可以看出, Presenter 主要负责事件驱动或者用户触发后的业务行为,在这里包括了页面初始化时候的加载数据loadData
和用户上拉列表时候的 loadMore
。
而View主要负责页面逻辑处理后的结果展现