Flutter 项目实战 架构模式四

///通过控制层传递实例到模型层

///方便控制层从模型层获取数据

IModel createModel();

///通过视图层传递实例到控制层

///方便控制层返回数据给视图层

V? _view;

V? get view => _view;

@override

void attachView(IView? view) {

_view = view as V?;

_model = createModel() as M?;

}

@override

void detachView() {

if (_view != null) {

_view = null;

}

}

}

通过 initState 函数向控制层 Presenter 传递IView

通过 dispose 函数解除对IView的引用

import ‘package:flutter/material.dart’;

import ‘package:flutter_splash_ios/mvp/BasePresenter.dart’;

abstract class BaseView extends StatefulWidget {

BaseView({Key? key}) : super(key: key);

@override

BaseViewState createState() => getState();

///子类实现

BaseViewState getState();

}

abstract class BaseViewState<V extends BaseView, P extends IPresenter>

extends State implements IView {

P? _presenter;

@override

void initState() {

// TODO: implement initState

_presenter = createPresenter();

if (_presenter != null) {

///传递IView引用到控制层(Presenter)

_presenter!.attachView(this);

}

super.initState();

}

P? createPresenter();

@override

void dispose() {

// TODO: implement dispose

if (_presenter != null) {

///解除IView引用

_presenter!.detachView();

}

super.dispose();

}

@override

Widget build(BuildContext context) {

return Scaffold(

///导航栏

appBar: buildAppBar(),

///内容区域

body: buildWidget(),

///内容区域背景颜色

backgroundColor: buildBodyColor(),

);

}

buildWidget();

buildAppBar() => null;

Color buildBodyColor() {

return Color(0xff00FFFFFF);

}

}

abstract class IView {

///开始加载数据

void startLoading();

///加载完成

void showLoadSuccess();

}

视图层、控制层、模型层 需要的 CallBack

import ‘package:flutter_splash_ios/mvp/BaseModel.dart’;

import ‘package:flutter_splash_ios/mvp/BasePresenter.dart’;

///视图层、控制层、模型层 需要实现的接口

abstract class CMineModel extends IModel {

///控制层调用

///获取数据后回传给控制层

loadData(SuccessCallback s, FailureCallback f);

}

abstract class CMinePresenter extends IPresenter {

///由视图层调用

///控制层进行加载数据

loadData();

}

abstract class CMineView {

///控制层返回的数据进行展示界面

loadData(data);

}

模型层 (Model) 实现

import ‘package:flutter_splash_ios/mvp/BaseModel.dart’;

import ‘package:flutter_splash_ios/mvp/buscal/BusCal.dart’;

class MMine extends BaseModel implements CMineModel {

@override

loadData(SuccessCallback s, FailureCallback f) {

// TODO: implement loadData

///通过接口回调将模型层数据传递给控制层

s(‘通过模型层加载的数据’);

}

}

控制层 (Presenter) 实现

import ‘package:flutter_splash_ios/mvp/BaseModel.dart’;

import ‘package:flutter_splash_ios/mvp/BasePresenter.dart’;

import ‘package:flutter_splash_ios/mvp/buscal/BusCal.dart’;

import ‘package:flutter_splash_ios/mvp/busimp/MMine.dart’;

class PMine extends BasePresenter<CMineView, CMineModel>

implements CMinePresenter {

@override

loadData() {

// TODO: implement loadData

///startLoading可以提示开始加载数据

view?.startLoading();

model?.loadData((data) {

//showLoadSuccess可以提示加载数据完成

view?.showLoadSuccess();

view?.loadData(data);

}, () {});

}

@override

IModel createModel() {

///传递模型层实例到控制层

return MMine();

}

}

视图层 (View) 调用控制层 (Presenter) 从模型层 (Model) 获取数据

class ImlBaseView extends BaseView {

@override

BaseViewState<BaseView, IPresenter> getState() {

// TODO: implement getState

return _ImlBaseViewState();

}

}

class _ImlBaseViewState extends BaseViewState<ImlBaseView, PMine>

implements CMineView {

var _homeMineData = ‘点击改变数据’;

@override

loadData(data) {

print(‘获取到的数据 $data’);

setState(() {

_homeMineData = ‘$data’;

});

}

///传递控制层实例

///视图层通过该实例从模型层加载数据

@override

PMine? createPresenter() {

return PMine();

}

@override

void startLoading() {

print(‘开始加载数据:startLoading’);

}

@override

void showLoadSuccess() {

print(‘加载数据完成:showLoadSuccess’);

}

@override

buildWidget() {

// TODO: implement buildWidget

return Center(

child: Column(

mainAxisAlignment: MainAxisAlignment.center,

children: [

Text(

‘$_homeMineData\n\n\n’,

style: Theme.of(context).textTheme.headline4,

),

FloatingActionButton(

onPressed: () {

///加载数据

presenter!.loadData();

},

tooltip: ‘改变HomePage数据’,

child: Icon(Icons.assignment_turned_in),

)

],

),

);

}

///改变内容区域背景颜色

@override

Color buildBodyColor() {

// TODO: implement buildBodyColor

return Colors.green;

}

}

flutter: 开始加载数据:startLoading

flutter: 加载数据完成:showLoadSuccess

flutter: 获取到的数据 通过模型层加载的数据

/ Flutter MVVM /

PMVVM

Widget 为视图层 从ViewModel获取数据 , 同时也可以改变ViewModel数据,实现互相绑定

ViewModel  负责从模型层获取数据 , 受视图层驱动修改数据

Model 数据来源,可以通过网络,也可以是从本地获取数据

模型层 Model

typedef void IMineModelCallBack(var _modelData);

abstract class IMimeModel {

void getMineData(IMineModelCallBack callBack);

}

class MineModel implements IMimeModel {

@override

void getMineData(IMineModelCallBack callBack) {

// TODO: implement getMineData

var _modelData = ‘首页改变后的数据’;

callBack(_modelData);

}

}

ViewModel

import ‘package:flutter/material.dart’;

import ‘package:pmvvm/view_model.dart’;

class MyViewModel extends ViewModel {

int counter = 0;

var modDat = ‘’;

InitCallBack initCallBack;

MyViewModel(this.initCallBack); // Optional

@override

void init() {

// It’s called after the ViewModel is constructed

var height = MediaQuery.of(context).size.height;

initCallBack(this);

}

// Optional

@override

void onBuild() {

// It’s called everytime the view is rebuilt

}

@override

void onDispose() {

// TODO: implement onDispose

super.onDispose();

counter = 0;

}

void increase() {

counter++;

notifyListeners();

}

///显示模型层(Model)数据

void shoModDat(var _data) {

modDat = _data;

notifyListeners();

}

}

typedef void InitCallBack(MyViewModel vm);

视图层(View)

import ‘package:flutter/cupertino.dart’;

import ‘package:flutter/material.dart’;

import ‘package:pmvvm/views/stateless.view.dart’;

import ‘…/vm/MyViewModel.dart’;

class MyView extends StatelessView {

const MyView({Key? key}) : super(key: key, reactive: true);

@override

Widget render(context, vmodel) {

return Column(

mainAxisAlignment: MainAxisAlignment.center,

crossAxisAlignment: CrossAxisAlignment.center,

children: [

Text(vmodel.modDat.toString()),

SizedBox(height: 24),

RaisedButton(onPressed: vmodel.increase, child: Text(‘Increase’)),

],

);

}

}

import ‘package:flutter/cupertino.dart’;

import ‘package:flutter/material.dart’;

import ‘package:flutter_mvvm/model/MineModel.dart’;

import ‘package:pmvvm/mvvm_builder.widget.dart’;

import ‘package:pmvvm/views/stateless.view.dart’;

import ‘…/vm/MyViewModel.dart’;

import ‘MyView.dart’;

class MyTwoPage extends StatefulWidget {

MyTwoPage({Key? key, required this.title}) : super(key: key);

final String title;

@override

_MyTwoPageState createState() => _MyTwoPageState();

}

class _MyTwoPageState extends State {

@override

Widget build(BuildContext context) {

return Scaffold(

appBar: AppBar(

title: Text(widget.title),

),

body: Center(

child: MyWidget(),

),

);

}

}

class MyWidget extends StatelessWidget {

const MyWidget({Key? key}) : super(key: key);

@override

Widget build(BuildContext context) {

return MVVM(

view: (context, vmodel) => MyView(),

viewModel: MyViewModel((vm) {

MineModel _mineModel = new MineModel();

_mineModel.getMineData((_modelData) {

更多Android高级工程师进阶学习资料

进阶学习视频

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

({Key? key}) : super(key: key);

@override

Widget build(BuildContext context) {

return MVVM(

view: (context, vmodel) => MyView(),

viewModel: MyViewModel((vm) {

MineModel _mineModel = new MineModel();

_mineModel.getMineData((_modelData) {

更多Android高级工程师进阶学习资料

进阶学习视频
[外链图片转存中…(img-xSbXpkB6-1714487852311)]

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-e6SZCtdT-1714487852312)]

里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 29
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值