三分钟让你深入了解//MVC、MVP、MVVM模式(深度解析、全实例讲解)

一文带你全面了解MVC、MVP、MVVM模式(实例讲解) 前言 在Android开发中,当你梳理完需求后,你要做的并不是马上写下你的第一行代码,而是需先设计好整个项目的技术框架 今天,我将全面介绍Android开发中主流的技术框架MVC、MVP 与 MVVM模式,并实例讲解MVP模式,希望您们会喜欢。 目录 1. 为什么要进行技术框架的设计 模块化功能 使得程序模块化,即:内部的高聚合、模块之间的低耦合 提高开发效率 开发人员只... 阅读详情
  • 在Android开发中,当你梳理完需求后,你要做的并不是马上写下你的第一行代码,而是需先设计好整个项目的技术框架
  • 今天,我将全面介绍Android开发中主流的技术框架MVC、MVP 与 MVVM模式,并实例讲解MVP模式,希望您们会喜欢。

目录


1. 为什么要进行技术框架的设计

  • 模块化功能
    使得程序模块化,即:内部的高聚合、模块之间的低耦合
  • 提高开发效率
    开发人员只需专注于某一点(视图显示、业务逻辑 / 数据处理)
  • 提高测试效率
    方便后续的测试 & 定位问题

切记:不要为了设计而设计,否则反而会提高开发量

!](//upload-images.jianshu.io/upload_images/944365-3dbfb477d9550b93.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)


2. Android开发主流的技术框架

  • 主要有MVC、MVP、MVVM 3种模式
  • 下面,我将详细 & 具体的介绍上述3种模式

2.1 MVC模式

  • 角色说明

  • 模式说明

  • 该模式存在的问题:Activity责任不明、十分臃肿
    Activity由于其生命周期的功能,除了担任View层的部分职责(加载应用的布局、接受用户操作),还要承担Controller层的职责(业务逻辑的处理)
    随着界面的增多 & 逻辑复杂度提高,Activity类的代码量不断增加,越加臃肿

2.2 MVP模式

  • 出现的原因
    为了解决上述MVC模式存在的问题,把分离Activity中的View层 和 Controller层的职责,从而对Activity代码量进行优化、瘦身,所以出现了MVP模式

  • 角色说明

  • 模式说明

  • 优点:(对比MVC模式)
  1. 耦合度更低:通过Presenter实现数据和视图之间的交互,完全隔离了View层与Mode层,二者互不干涉

避免了View、Model的直接联系,又通过Presenter实现两者之间的沟通

  1. Activity代码变得更加简洁:简化了Activity的职责,仅负责UI相关操作,其余复杂的逻辑代码提取到了Presenter层中进行处理

2.3 MVVM

为了更加分离M、V层,更加释放Activity的压力,于是出现了MVVM模式

  • 定义
    VM层:ViewModel,即 View的数据模型和Presenter的合体

基本上与 MVP 模式完全一致,将逻辑处理层 Presenter 改名为 ViewModel

  • 模式说明

  • 优点
    使得视图层(View)& 控制层(Controller)之间的耦合程度进一步降低,关注点分离更为彻底,同时减轻了Activity的压力

本文主要讲解MVC和MVP模式,不过多阐述MVVM模式.


3. MVC、MVP模式的区别


4. 三种模式出现的初衷

  • MVC模式的出现
    为解决程序模块化问题,于是MVC模式出现了:将业务逻辑、数据处理与界面显示进行分离来组织代码,即分成M、V、C层;
  • MVP模式的出现
    但M、V层还是有相互交叉、隔离度不够,同时写到Activity上使得Activity代码臃肿,于是出现了MVP: 隔离了MVC中的 M 与 V 的直接联系,将M、V层更加隔离开来,并释放了Activity的压力;
  • MVVM模式的出现
    为了更加分离M、V层,更加释放Activity的压力,于是出现了MVVM: 使得V和M层之间的耦合程度进一步降低,分离更为彻底,同时更加减轻了Activity的压力。

下面,我将详细讲解一下最常用的MVP模式的核心思想 & 使用


5. MVP模式详解

此处主要详细分析MVP模式的核心思想,并实例说明。

5.1 核心思想

把Activity里的逻辑都抽离到View和Presenter接口中去 & 由具体的实现类来完成。具体实现思路如下:

  1. 把Activity中的UI逻辑抽象成View接口 & 由具体的实现类来完成
  2. 把业务逻辑抽象成Presenter接口 & 由具体的实现类来完成
  3. Model类还是原来MVC模式的Model层

5.2 实现步骤

MVP模式的UML图

通过UML图可看出,使用MVP模式的步骤如下:

5.3 实例讲解

本节通过一个 英语词典app实例 讲解 MVP模式具体的实现

前言:工程项目的列表架构

MVP技术架构的项目结构非常清晰:把M、V、P层分别分为三个文件夹:Model、View、Presenter,每个文件下分别是对应的接口和实现的类

其中Model层的fanyi类是作为实现用GSON解析JSON信息的一个JavaBean

步骤1:设置View层(IView接口 & 实现类)

 

/**
  * View接口:IfanyiView
  * 需定义在实现类中需要用到的方法
  */

  public interface IfanyiView {    

    void init();//初始化   
    void SetInfo(String str); //输出翻译信息    
    void SetError(); //输出出错信息

    }

/**
  * View实现类:MainActivity类
  * 注:由于MainActivity是对应View层的实现类,所以要实现View层的接口
  */

  public class MainActivity extends AppCompatActivity implements IfanyiView {   

      private EditText et;    
      private TextView tv;    
      CidianPresenter cidianPresenter;  // 声明了Presenter对应类 

        @Override    
        protected void onCreate(Bundle savedInstanceState) { 
               super.onCreate(savedInstanceState); 
               setContentView(R.layout.activity_main);        
                  // 实例化P对应类的对象和findView        
                   init();        
                // 接受用户的输入  
                findViewById(R.id.btnfanyi).setOnClickListener(new View.OnClickListener() {      

                    @Override            
                    public void onClick(View v) {                
                    //将View层获得的数据传入Presenter层 ,注意还要传递MainActivity
                          cidianPresenter.InputToModel(et.getText().toString(), MainActivity.this);            
                         }        
                      });    
                    }    

                    @Override    
                    public void init(){        
                    //实例化P类的对象和findView        
                      cidianPresenter = new CidianPresenter(this);        
                      et = (EditText) findViewById(R.id.editText);        
                      tv = (TextView) findViewById(R.id.tv);    
                    }

                    @Override  
                    //输出出错信息   
                    public void SetError() {        
                      tv.setText("查询不成功,请检查网络");    
                     }

                    //输出翻译信息
                    @Override    
                    public void SetInfo(String str){        
                    tv.setText(str);    
                     }
                    }

  // 从上述代码可看出,MainActivity只做了FindView、setListener的工作(包含了cidianPresenter),简洁清爽!

步骤2:设置Presenter层(创建IPresenter接口&实现类)

 

/**
  * Presenter接口:ICidianPresenter
  * 需定义在实现类中需要用到的方法
  */

  public interface ICidianPresenter {    

     void InputToModel(String input,Context context); // 将View层获得的数据传入Model层

  }

/**
  * Presenter层的实现类:CidianPresenter类
  * 注:由于CidianPresenter是对应Presenter层的实现类,所以要实现Presenter层的接口
  */

  public class CidianPresenter implements onfanyiListener,ICidianPresenter {    
      // 1\. 声明View层对应接口、Model层对应的类    
      IfanyiView fyV;    
      fanyimodel fanyimodel;    

      // 2\. 重构函数,初始化View接口实例、Model实例    
      public  CidianPresenter(IfanyiView fyV){        
          this.fyV = fyV;        
          fanyimodel = new fanyimodel();   
       }  

      // 3.将View层获得的数据传入Model层,注意要传递this.当前类
          @Override    
          public void InputToModel(String input, Context context){  

          fanyimodel.HandleData(input, context, this);    

          }    
          // 回调函数,调用UI更新  
          @Override    
          public void onSuccess(String str) {        
              fyV.SetInfo(str);    }  
          // 回调函数,调用UI输出出错信息
          @Override    
          public void onError() {        
              fyV.SetError();    } 
          }

      // 注:
      // a. 保留IfanyiView的引用,就可直接在CidianPresenter当前类进行UI操作而不用在Activity操作
      // b. 保留了Model层的引用就可以将View层的数据传递到Model层

步骤3:Model层(Model层接口 & 实现类)

 

/**
  * Model层接口:Ifanyi
  * 需定义在实现类中需要用到的方法
  */
  public interface Ifanyi {  

    void HandleData(String input,Context context,final onfanyiListener listener);    
    String fanyiToString(fanyi fy);

  }

/**
  * Model层的实现类:fanyiModel类
  * 注:由于fanyiModel是对应Model层的实现类,所以要实现Model层的接口
  */

  public class fanyimodel implements Ifanyi {

      private fanyi fy = new fanyi();

      public void HandleData(String input,Context context,final onfanyiListener listener){

          // 使用Volley框架来实现异步从网络的有道API获取翻译数据
          RequestQueue mQueue = Volley.newRequestQueue(context);
          StringRequest stringRequest = new StringRequest("http://fanyi.youdao.com/openapi.do?keyfrom=Yanzhikai&key=2032414398&type=data&doctype=json&version=1.1&q="+input, new Response.Listener<String>() {
              @Override
              public void onResponse(String s) {

                  // 用Gson方式解析获得的json字符串
                  Gson gson = new Gson();
                  fy = gson.fromJson(s.trim(),fy.getClass());

                  // 回调监听器的函数把处理数据后的结果(翻译结果)返回给Presenter层
                  listener.onSuccess(fanyiToString(fy));
              }
          }, new Response.ErrorListener() {
              @Override
              public void onErrorResponse(VolleyError volleyError) {
                  listener.onError();
              }
          });
          mQueue.add(stringRequest);
      }

      public String fanyiToString(fanyi fy){
          // 处理解析后的json数据,转成UI输出的字符串
          String strexplain = "解释:";
          String strphonetic = "发音:";
          String strweb = "网络释义:";
          if (fy.basic == null){return "你所查找的还没有准确翻译";}
          for (int i = 0; i<fy.basic.explains.length; i++){
              strexplain +=fy.basic.explains[i]+"\n";
              if (i != fy.basic.explains.length-1 )
              {strexplain +="\t\t\t\t";}
          }
          strphonetic += fy.basic.phonetic +"\n";
          for (int i = 0; i<fy.web.size(); i++){
              for(int j = 0; j<fy.web.get(i).value.length;j++)
              {
                  strweb += fy.web.get(i).value[j]+",";
              }
              strweb += fy.web.get(i).key+"\n";
              strweb += "\t\t\t\t\t\t\t";
          }
          return strexplain+"\n"+strphonetic+"\n"+strweb;
      }
  }

至此,关于MVP模式的实例讲解,讲解完毕。


6. 总结

  • 本文主要讲解了Android开发中主流的技术框架MVC、MVP 与 MVVM模式

小编整理了一些关于面试类的文章,含有从基础到进阶。含有BATJ.字节跳动面试专题,算法专题,高端技术专题,混合开发专题,java面试专题,Android,Java小知识,到性能优化.线程.View.OpenCV.NDK等应有尽有。还有辅之相关的视频+学习笔记

话不多请看下图↓↓↓ (把所有的知识+每日一题整理了)

可以进裙回复【333】获取完整资料

MVC、MVP、MVVM三种模式的介绍及区别(代码例子说明) 主要介绍几种架构模式,以及之间的区别 阅读详情

相关推荐

JavaWeb MVC架构:深入理解MVC模式及其在Web开发中的应用

在软件开发领域,MVC(Model-View-Controller)架构模式是一种被广泛应用且备受推崇的设计模式。它通过将应用程序的逻辑、数据和用户界面展示进行分离,使得软件开发更加模块化、可维护性和可重用性更高。本文将深入探讨MVC模式的基本概念、工作原理及其在JavaWeb开发中的具体应用。

Java&AI小吕布的博客 1238

一篇文章讲清楚Android中的MVC、MVP、MVVM架构 (附实现代码)

MVC、MVP、MVVM大体上都是把系统划分成3个模块:视图层、业务层、数据层。但是他们的通信方式、数据流动方向不一致,形成了不同的架构。其后面产生的架构都是为了更好的解耦,解决已有架构的不足。每个架构都有自己的优缺点,没有最好的架构,只有最合适的架构。

bugyinyin的博客 6785

Xcode 26.3深度体验:我是如何用Claude智能体一天重构老项目的

本文分享了作者利用Xcode 26.3集成的Claude智能体,在一天内高效重构一个遗留iOS项目的深度体验。文章详细介绍了如何配置Claude智能体进行跨文件分析、制定重构计划,并分阶段将UIKit视图迁移至SwiftUI、将Core Data升级为SwiftData,同时确保零功能回归。整个过程展示了AI如何作为“首席架构师”,协助处理复杂工程任务,大幅提升开发效率。

weixin_28839439的博客 375

MVC,MVP 和 MVVM 的图示

地址:http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html 复杂的软件必须有清晰合理的架构,否则无法开发和维护。 MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用。它本身很容易理解,但是要讲清楚,它与衍生的 MVP 和 MVVM 架构的区别就不容易了。 昨天晚上,我读了《Sc

swust_chenpeng的专栏 1140

三种架构模式——MVC、MVP、MVVM

MV系列框架中,M和V分别指Model层和View层,但其功能会因为框架的不同而变化。Model层是数据模型,用来存储数据;View层是视图,展示Model层的数据。虽然在不同的框架中,Model层和View层的内容可能会有所差别,但是其基础功能不变,变的只是数据的传输方式 。本文讲解MVC、MVP和MVVM三种架构模式。

zg0601的博客 3万+

Android中MVP模式的经典案例,极度适合新手入门,一一哥亲情奉献

Android中MVP模式的经典案例,极度适合新手入门,一一哥亲情奉献.非常经典的MVP入门级教程,注释非常详细.

移动互联网迎来裁员寒潮,Android开发者该在2024年如何决择?

一线互联网Android面试题总结含详解(初级到高级专题)**[外链图片转存中…(img-ObeEGKbE-1711883534281)]

m0_56169789的博客 1042

自定义android开发MVP+ViewBinding架构Demo(升级版)

附件为个人编写的自定义android开发MVP+ViewBinding架构Demo,已经在多个项目中使用,相对比较成熟了。使用当前主流的MVP+Viewbing架构模式,喜欢的小伙伴请给个好评,谢谢!(以此篇为准)

MVC、MVP、MVVM深入理解与使用

对现在的Android架构与技术的选择进行了重新的思考,同时总结了对MVC、MVP、MVVM这三个典型架构深入的理解及它们的应用方法,给出了应用的示例代码。

tyhj_sf的博客空间 2275

stm32F103定时器使用方法

文章目录1、STM32的Timer简介2、普通定时器TIM2-TIM52.1 时钟来源2.2 计数器模式2.3 编程步骤3、程序源代码4、总结 1、STM32的Timer简介 STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗定时器以后再详细研究。今天主要是研究剩下的8个定时器。 其中TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟

weixin_43582209的博客 4515

基于人脸识别的驾驶员疲劳检测方法研究

摘 要交通安全问题愈发严重,疲劳驾驶已是造成交通事故的主要因素之一。为减少因疲劳驾驶造成的交通事故,本文设计了一种基于图像处理技术的疲劳驾驶监测系统,该系统结合了肤色模型、灰度积分投影技术以及PERCLOS方法,旨在通过实时视频图像分析准确检测驾驶员的疲劳状态。首先,系统通过肤色模型从图像中有效提取人脸区域,并在此基础上利用Haar级联分类器进行人脸检测,确保在人脸角度变化或部分遮挡的情况下依然能够实现高效识别。接着,灰度积分投影技术被应用于眼部定位,通过分析眼睛区域的灰度变化,精确确定眼睛的上下边界,从

carrott0617的博客 1005

选择恐惧症的福音!教你认清MVC,MVP和MVVM

相信大家对MVC,MVP和MVVM都不陌生,作为三个最耳熟能详的Android框架,它们的应用可以是非常广泛的,但是对于一些新手来说,可能对于区分它们三个都有困难,更别说在实际的项目中应用了,有些时候想用MVP的,代码写着写着就变成了MVC,久而久之就对它们三个的选择产生了恐惧感,如果你也是这样的人群,那么这篇文章可能会对你有很大的帮助,希望大家看完都会有收获吧! 文章重点: (1)了

LightLu 2428

ATE测试基础——直流参数测试

芯片测试在发展过程中诞生了许多术语,初次接触的人大部分都会被绕晕。因此为方便广大读者理解,在开始介绍测试项之前,需要对测试领域的名词进行解释。还有部分较为抽象的内容,需要略作展开。DUT——Device Under Test,正在被测试的器件Pin——器件引脚,信号引脚分为输入,输出,三态和双向四类,负责与外界进行信息交互;电源引脚分为电源和地两类,结构与信号引脚不同,负责给器件内部运行和外部输出提供电平。输入:在外部信号和器件内部逻辑之间起缓冲作用的信号输入通道;

你骄傲地飞远的博客 1万+

Android官方MVP架构示例项目解析

前段时间Google在Github推出了一个项目,专门展示Android引用各种各样的MVP架构,算是官方教程了。趁着还新鲜,让我们来抛砖引玉一探究竟,看看在Google眼里什么样算是好的MVP架构。 App架构在Android开发者中一直是讨论比较多的一个话题,目前讨论较多的有MVP、MVVM、Clean这三种。google官方对于架构的态度一直是非常开放的,让开发者自主选择组织和架构

LightLu 4379

DRM驱动架构浅析-上(DRM基础概要与U-Boot阶段驱动解析)

本文主要探讨了Rockchip平台的DRM显示驱动架构及其在U-Boot阶段的实现。

一路寒风身如絮,命海沉浮客独行 1762

时序数据库避坑指南:TDengine与IoTDB在车联网场景的7个关键对比

本文对比了时序数据库TDengine与IoTDB在车联网场景下的7个关键差异,包括数据模型设计、边缘-云端协同能力、车规级函数库、存储压缩算法等。通过真实案例和性能测试,帮助企业在新能源汽车大数据处理中选择合适的时序数据库,优化存储成本和实时告警性能。

rust6ferris的博客 452

MVC、MVP、MVVM的理解

MVC M->Model,主要功能是数据请求等业务处理; V->View,Activity和Fragment; C->Controller,核心业务层,也在Activity和Fragment中; 传统的开发模式,优点是文件小,主要写一个xml布局文件和Activity/Fragmeng控制层以及一个网络请求封装工具类就可以了,但这就会导致一个十分严重的问题,代码臃肿,因为所有的核心业务,实现逻辑都在Controller层,因此一些业务复杂的页面,Activity/Fragment的代码上

gaobaiq的博客 339

YOLOv13改进策略【注意力机制篇】| ICASSP 2023 EMA 高效多尺度注意力,跨空间学习提高远距离建模依赖

ICASSP 2023 EMA 高效多尺度注意力在 YOLOv13 的接入实战:跨空间学习提升远距离依赖建模,含原理图解、完整代码、yaml 配置与实测参数量对比(ultralytics 8.3.63)。

qq_53329130的博客 932

Android MVP架构(3)MVP框架的使用

上一篇中主要介绍了MVP框架的基本实现过程,那么实际过程中如何使用MVP框架呢。其实非常简单。 MVP架构的主要目的就是进行解耦,同时使各部分的代码逻辑层次分明,分工明确。鉴于这种思想,需要对功能类似的模块进行规划处理,以最基本的登录注册功能为例,需要创建的目录如图: 可以看到,对比传统的MVC架构,代码文件彷佛增加了不少,但是层次却更加分明了,通过严格的将模块分为MVP三层结构,使得拓展以及维护的可行性增加,阅读性也更加良好。 以拓展一个登录功能为例,需要执行的步骤为: ILoginVie

Welcome to Domla's world 650

“双系统”出炉!瑞芯微RK3562J非对称AMP:Linux+RTOS/裸机

执行如下命令运行Linux应用程序rpmsg_echo,发送8个rpmsg数据包至运行Baremetal程序的Cortex-M0核心,当Cortex-M0核心每收到1个rpmsg数据包就会将数据包发送回Linux端。开发者可灵活分配任务或指定核心间通信,从而增强系统稳定性,减少崩溃风险,保障数据完整。下文以Cortex-A53(CPU0、CPU1、CPU2、CPU3)核心运行Linux系统与rpmsg_echo应用程序,Cortex-M0(MCU)核心运行Baremetal程序为例进行演示。

创龙,嵌入式一体化解决方案商 467

工业4.0必备:C#上位机+数字孪生 生产线实时监控与智能预警系统(工业级实战)

数据割裂:PLC、传感器、工业相机的数据散落在不同系统,想看全局生产状态要切换N个软件,“数据孤岛”导致决策滞后;故障难预判:设备突发故障时,只能停机排查,平均故障响应时间超30分钟,一条生产线停工1小时损失超10万;可视化差:传统监控只有冰冷的数字和2D图表,设备运行状态、生产流程、物料流转无法直观感知,新人上手需3个月才能熟悉产线。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 658

Android开发MVP模式--项目实战

1 前言 苏宁+App是苏宁易购集团零售云研发中心分销研发中心主要产品之一,由于项目处于初期阶段,业务逻辑复杂,导致业务需求变动快,常常在开发甚至测试过程中出现界面或者后台接口调整的情况。 App客户端如何在外部需求不断变化的情况下,降低模块耦合,尽可能减少每次代码修改量,一方面减少开发人员的工作量,另一方面降低测试工程师的工作量,最终顺利完成项目迭代开发。 2 为什么使用MVP模式 ...

曹银飞的专栏 5401

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

程序员深度学习!渣本毕业两年经验,面试心得体会

前言 回顾一下自己这段时间的经历,因公司突然通知裁员,我匆匆忙忙地出去面了几家,但最终都没有拿到offer,我感觉今年的寒冬有点冷。公司开始第二波裁员,我决定主动拿赔偿走人。后续的面试过程我做了一些准备,基本都能走到hr面,后面我也顺利地拿到了offer,我给大家分享下我的求职体会,希望能给大家一些参考。 1.【字节跳动全套高级学习资料】九大专题: 1.高级UI,自定义View UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。 不过很显然现在远远

CHAMPION8888的博客 770

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

MVP 在项目中的最佳实战(封装篇)

作者 夏至,欢迎转载,但请保留这段申明 说到 MVP ,大家应该都不陌生了,由于其高度解耦等有点,越来越多的项目使用这个设计模式;然而,有点虽在,缺点也不少,其中一个就是类多了很多,而且 V 与 P 直接要项目通信,那么 P 就得持有 V 得实例,但如果 activity 挂掉了,如果没有对 V 进行释放,又有导致内存溢出得问题,而且,那么多的接口函数,看得人眼花缭乱,也使得很多人在使用这个模式的时

夏至的稻穗的博客 5222

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

阿里权威官宣!深入了解Flutter,这一篇就够了

原文转自:腾讯技术工程 当 Flutter 遇见 Web,会有怎样的秘密? 在线教育团队(简称:OED)已经将 Flutter 这样技术在业务中落地了,做为 IMWeb 前端团队的我们也要进行一些尝试。本文从前端角度进行 Flutter 开发的概况描述。主要是为了让您了解和感受一下:Flutter to Web 的实例、Flutter 为什么会出现、Flutter 设计实现原理、Flutter 技术特点和优势。 前言 OED的客户端团队在 2019 年上半年 ,就已经把 Flutter 落地..

粉丝交流群:569545109 2514
上一篇: 一篇就够!!!Flutter 最全开源项目,从新手到Flutter架构师,(详解UI、导航、网络、导航、音视频...)
下一篇: Android企业面试必不可少的一关【Flutter】
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值