Flutter 项目实战 架构模式四(1),2024网易Android高级面试题及答案

本文详细介绍了Flutter中的MVVM架构模式,包括Model、View、ViewModel和绑定器的作用,以及StatefulWidget在视图层的控制角色,对比了MVC和MVP模式。展示了如何在实际代码中实现数据请求和状态管理。
摘要由CSDN通过智能技术生成

视图层 : 界面(Widget)

Presenter : 负责转发请求,对请求进行处理

MVVM模式Model–view–viewmodel

软件架构模式

将视图界面和业务逻辑分离开

由四个部分组成 : 模型(Model)、视图(View)、视图模型(ViewModel)、和 绑定器

模型层 : 内容的数据访问层

视图层 : 屏幕上看到的结构、布局和外观(UI)

视图模型 : 暴露的公共属性和视图的抽象, MVVM没有MVC模式的控制器,也没有MVP模式的presenter

绑定器 : 可以实现数据&UI双向绑定=>数据变更UI自动刷新,UI变更自动同步数据

/ Flutter MVC /

StatefulWiget 就相当于控制层(Controller)负责从模型层(Model)获取数据

View 就是被绑定到StatefulWiget里面的多个Widget

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);

}

}

class MyHomePage extends StatefulWidget {

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

final String title;

@override

_MyHomePageState createState() => _MyHomePageState();

}

class _MyHomePageState extends State {

var _homeMineData=‘首页改变前的数据’;

void _changeMineData() {

MineModel _model=new MineModel();

_model.getMineData((_modelData) {

setState(() {

this._homeMineData=_modelData;

});

});

}

@override

Widget build(BuildContext context) {

return Scaffold(

appBar: AppBar(

title: Text(widget.title),

),

body: Center(

child: Column(

mainAxisAlignment: MainAxisAlignment.center,

children: [

Text(

‘$_homeMineData’,

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

),

],

),

),

floatingActionButton: FloatingActionButton(

onPressed: _changeMineData,

tooltip: ‘改变HomePage数据’,

child: Icon(Icons.add),

), // This trailing comma makes auto-formatting nicer for build methods.

);

}

}

/ Flutter MVP /

StatefulWidget 可以作为视图层负责处理界面呈现和用户交互

Presenter 处理业务,负责业务逻辑,发起数据请求(网络获取数据 | 本地获取数据)

Mode 数据源

调用顺序 View -> Presenter -> Model ,不可以反向调用,不可以跨级调用。

创建BaseModel

abstract class IModel {

//待扩展

}

abstract class BaseModel implements IModel {

//待扩展

}

///获取数据成功回调

typedef SuccessCallback = void Function(dynamic data);

///获取数据失败回调

typedef FailureCallback = void Function();

创建 BasePresenter

通过IModel建立 Presenter 和 Model的联系

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

abstract class BasePresenter {

///模型层实例

M? _model;

M? get model => _model;

///通过控制层传递实例

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

IModel createModel();

}

创建 BaseViewState

BaseView 用于传递Key 用于视图的刷新, 也可以传递其他类型的参数

key 分为 LocalKey (ValueKey、ObjectKey、UniqueKey) ") 和 GlobalKey

IView 建立 Presenter(控制层)  和  视图层 (View)  联系

import ‘package:flutter/material.dart’;

abstract class BaseView extends StatefulWidget {

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

@override

BaseViewState createState() => getState();

///子类实现

BaseViewState getState();

}

abstract class BaseViewState extends State {

@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();

}

扩展 BasePresenter ,建立 Presenter(控制层)  和  视图层 (View)  联系

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

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

abstract class IPresenter {

///通过视图层传递IView引用

void attachView(V? view);

///解除IView引用

void detachView();

}

abstract class BasePresenter<V extends IView, M extends IModel>

implements IPresenter {

///模型层实例

M? _model;

M? get model => _model;

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

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

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
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

下面是辛苦给大家整理的学习路线

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-vFVnoAim-1712510899748)]

[外链图片转存中…(img-2WGGQ6sE-1712510899748)]

[外链图片转存中…(img-m1vladVS-1712510899749)]

[外链图片转存中…(img-qrDJoTr7-1712510899749)]

[外链图片转存中…(img-aWySbdk3-1712510899749)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

下面是辛苦给大家整理的学习路线

[外链图片转存中…(img-6ywrSySo-1712510899749)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值