final String subtitle;
final Icon accessory;

}

// 使用 Presenter 创建一个新的视图模型。
myListItem = myPresenter.present();

// 传递视图模型到 View 来渲染新的视图外观。
myListItemView.update(myListItem);

这种使用视图模型的基本原理,与 Flutter 无关,但与传统的 View 相比,理解视图模型是非常重要的。视图模型是一个不可变的配置,需要应用于生命周期长的,可变的 View。
传统 Android 和 iOS 中的依赖关系如下:

MyAndroidView -> MyAndroidViewModel

MyiOSUIView -> MyiOSViewModel

换句话说,在传统的 Android 和 iOS 中,我们主要使用可变的,生命周期长的 View(和 UIView)。我们通过使用那些生命周期长的 View(和UIView)Object来定义布局 XML,Storyboard 和可编程的布局。然后,我们不定期会传递新的视图模型来改变它们的界面。
现在,让我们来谈谈 Flutter。
Flutter 颠覆了这种依赖关系
与其使用可变的、生命周期长,且会不定期接收新的视图模型的 View,不如我们只使用不可变视图模型,来配置可变的、生命周期长的 View?
以前是:

MyView -> MyViewModel

现在改为:

MyViewModel -> MyView

就像这样,简单来说,我们刚刚发明了 Flutter 的组件系统:

MyWidget -> MyElement
MyWidget -> MyRenderObject

这些组件都是不可变的,其中包含了许多用于配置渲染内容方式的属性:
// 这个组件看起来肯定很像一个视图模型,不是吗?

new Container(
width: 50.0,
height: 50.0,
padding: EdgeInsets.all(16.0),
color: Colors.black,
);

// Flutter 组件和传统视图有一个很大的区别
// 就是这些组件同样可以
// 实例化生命周期长的视图
final mutableSubtree = myContainer.createElement();
final mutableRender = myContainer.createRenderObject();

但为什么这些组件能创建这两样东西呢?我认为,组件应该只能创建一个生命周期长的视图?
在 Flutter 中,父/子的概念独立于渲染而存在。在 iOS 和 Android 中,父/子关系与绘制到屏幕的概念是一致的。
例如,在 Android 中,ViewGroup 需要负责:

// 父/子关系
myViewGroup.addView(…);
myViewGroup.removeView(…);

// 以及

// 布局和绘制
myViewGroup.measure(…);
myViewGroup.layout(…);
myViewGroup.draw(…);
复制代码在 Flutter,我们有
// Element 来管理父/子关系
myElement.mount(); // 这创建并添加子级组件
myElement.forgetChild(…); // 移除子级组件

// 用 RenderObjects 来布局和绘制:
myRenderObject.layout();
myRenderObject.paint();

所以说,尽管 Flutter 中的组件负责创建一个 Element 和一个 RenderObject,但这两个 Object的组合等同于 Android 单个 ViewGroup 相同的功能。
因此,在 Flutter 中,我们使用可以配置 View 的视图模型,而不是使用视图模型配置的 View。这种关系是颠倒的。
##为什么说这种颠倒关系是个大问题
颠倒视图模型的关系,以及如果一个视图模型知道如何实例化相对应的一个长生命周期的视图,你可能会感到特别奇怪。但 Flutter 向我们展示的是,通过颠倒这种关系,我们实现了以声明方式组合用户界面的能力。
在我看来,Flutter 正在做的事情,从根本上说,像是正在接近绘制像素的特定领域语言。
特定领域的语言是几乎所有开发人员的终极目标。如果你正在为航空业开发应用,那么你将花费大量时间构建行业特定术语的实现,如航班清单、登机牌、座位分配和会员身份。你在利用较低级别的语言语义,来表示这些术语在你的行业中的含义。然而,理想情况下,在某些时候,开发人员将停止使用这种较低级别的构造方式,他们将开始使用像 FlightManifest、BoardingPass 和 SeatAssignment 这样的 Object 来实现整个应用。
但并非每个问题都是商业问题。一些问题是技术问题,例如渲染。渲染用户界面本身就是一个问题范畴。Flutter 正通过设计出用于渲染用户界面的一种特定领域的语言来解决此问题。就像 SQL 是用于搜索信息声明式的领域特定语言一样,Flutter 的组件系统正在成为用于组合用户界面的声明式的领域特定语言。这可以通过在外部放置不可变视图模型,同时将可变视图限制在内部来实现。
希望这个视角,可以帮助你理解和欣赏 Flutter 中的组件。但是如果没有,只要你继续使用 Flutter 的 API,最终你也会体验出个中的妙处。

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

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

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

img

img

img

img

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

如果你觉得这些内容对你有帮助,可以扫码领取!!!!

最后

都说三年是程序员的一个坎,能否晋升或者提高自己的核心竞争力,这几年就十分关键。

技术发展的这么快,从哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;

我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 PDF(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。

Java语言与原理;
大厂,小厂。Android面试先看你熟不熟悉Java语言

高级UI与自定义view;
自定义view,Android开发的基本功。

性能调优;
数据结构算法,设计模式。都是这里面的关键基础和重点需要熟练的。

NDK开发;
未来的方向,高薪必会。

前沿技术;
组件化,热升级,热修复,框架设计

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

我在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多

当然,想要深入学习并掌握这些能力,并不简单。关于如何学习,做程序员这一行什么工作强度大家都懂,但是不管工作多忙,每周也要雷打不动的抽出 2 小时用来学习。

不出半年,你就能看出变化!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可免费领取!

多忙,每周也要雷打不动的抽出 2 小时用来学习。

不出半年,你就能看出变化!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可免费领取!

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐