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,最终你也会体验出个中的妙处。
作者:ALVIN君
链接:https://juejin.im/post/5b46f836f265da0f8f2025f7
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
总结
算法知识点繁多,企业考察的题目千变万化,面对越来越近的“金九银十”,我给大家准备好了一套比较完善的学习方法,希望能帮助大家在有限的时间里尽可能系统快速的恶补算法,通过高效的学习来提高大家面试中算法模块的通过率。
这一套学习资料既有文字档也有视频,里面不仅仅有关键知识点的整理,还有案例的算法相关部分的讲解,可以帮助大家更好更全面的进行学习,二者搭配起来学习效果会更好。
部分资料展示:
有了这套学习资料,坚持刷题一周,你就会发现自己的算法知识体系有明显的完善,离大厂Offer的距离更加近。
资料获取方法:点赞+关注+转发,然后进入我的【GitHub】,里面有免费获取途径
资料获取方法:点赞+关注+转发,然后进入我的【GitHub】,里面有免费获取途径