MVC、MVP、BloC、Redux四种架构在Flutter上的尝试,超赞回答:Android如何进阶

}
}

网络层的相关代码就不再贴出,感兴趣的可以在本文末尾下载源码进行查看。

由上面代码可知,当View层触发登录时,调用了Controllogin接口,在该接口内,实现了展示loading状态,并等待登录的网络请求,当请求完成后,则取消loading状态,最终交给View层进行数据处理,相关处理的代码如下所示

_login() async {
String name = _nameController.text;
String password = _passwordController.text;

await Con.instance.login(this, name, password);

if (Con.userBean != null) {
NavigatorUtil.goHome(context, Con.userBean);
} else {
ToastUtil.showToast(‘登录失败,请重新登录’);
}
}

到此,MVC整个框架的登录流程已进行完成。

MVP

该架构是在进行Android开发时,是一种比较常用的架构。

架构视图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

程序入口

main.dart是程序的入口,完成登录界面的启动,相关代码如下所示

void main() => runApp(MVPApp());

class MVPApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primaryColor: Colors.black,
),
home: LoginPage(),
);
}
}

登录流程

MVC一致,可以参考MVC

文本监听

MVC一致,可以参考MVC

清空账号输入框

MVC一致,可以参考MVC

密码是否可见

MVC一致,可以参考MVC

触发登录

View层点击登录按钮,触发Presenter层登录逻辑,在Presenter层通过View层提供的接口来控制loading界面的展示和隐藏,loading UI相关代码如下所示

Offstage(
offstage: !isLoading,
child: new Container(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
color: Colors.black54,
child: new Center(
child: SpinKitCircle(
color: Theme.of(context).primaryColor,
size: 25.0,
),
),
),
),

上面代码中的isLoading状态已在基类中做了统一封装,下面对MVP做定义封装。

封装View层

触发网络请求,需要满足展示和隐藏loading界面,所以View的对外需要提供这两个最基本的接口,如下面代码所示

abstract class IBaseView {
showLoading();

hideLoading();
}

封装Presenter层

Presenter层的公共接口只需提供对View层的注册以及反注册,如下面代码所示

abstract class IBasePresenter {
void onAttachView(V view);

void onDetachView();
}

下面对Presenter层的代码实现上面所提供的接口,如下面代码所示

abstract class BasePresenter extends IBasePresenter {
V view;

@override
void onAttachView(IBaseView view) {
this.view = view;
}

@override
void onDetachView() {
this.view = null;
}
}

封装State基类

State基类中,需要提供Presenter的初始化的方法、loading状态、数据初始化以及视图的构建等,如下面代码所示

abstract class BaseState<T extends StatefulWidget, P extends BasePresenter,
V extends IBaseView> extends State implements IBaseView {
P presenter;

bool isLoading = false;

P initPresenter();

Widget buildBody(BuildContext context);

void initData() {
}

@override
void initState() {
super.initState();
presenter = initPresenter();
if (presenter != null) {
presenter.onAttachView(this);
}
initData();
}

@override
void dispose() {
super.dis

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值