有没有想过Flutter如何获取这些小部件并将其实际转换为屏幕上的像素?

您可能已经知道如何使用StatelessWidget和StatefulWidget。但是那些小部件仅构成其他小部件。布置小部件并将其渲染在其他位置进行。

不透明度(Opacity)

注:随着SDK的更新参数可能有变化

它只接受一个child。因此,您可以将任何小部件包装在中,Opacity并更改其显示方式。除child外,只有一个参数被调用opacity,该参数的值在0.0到1.0之间。它控制不透明度。

The Widget(Opacity小部件)

Opacity小部件继承了SingleChildRenderObjectWidget.

扩展类扩展的层次结构如下:

Opacity -> SingleChildRenderObjectWidget -> RenderObjectWidget -> Widget

相反,StatelessWidget和StatefulWidget如下:

StatelessWidget/StatefulWidget -> Widget

区别在于,Stateless/StatefulWidget仅构成控件,而"Opacity"控件实际上改变了控件的绘制方式

但是,如果您查看这些类中的任何一个,您将找不到与实际绘制不透明度相关的任何代码

这是因为小部件仅保存配置信息。 在这种情况下,Opacity小部件仅保留不透明度值。

这就是为什么每次调用构建函数时都可以创建新的小部件的原因。因为窗口小部件的构造并不昂贵。它们仅仅是信息的容器。

The Rendering(Opacity怎么渲染的?)

它在RenderObjects内部

RenderObject负责一些事情,包括渲染。

Opacity小部件使用这些方法创建和更新RenderObject:

  @override
RenderObject createRenderObject(BuildContext context) {
return RenderOpacity(opacity: opacity);
} @override
void updateRenderObject(BuildContext context, RenderOpacity renderObject) {
renderObject..opacity = opacity;
}

渲染不透明度

该Opacity部件尺寸本身是完全相同的大小作为其子(child)一样。它基本上模仿了孩子(child)的各个方面,除了绘画。在绘制其子项之前,先为其添加不透明度。

在这种情况下,RenderOpacity需要实现所有方法(例如执行布局/命中测试/计算大小),并要求其子级执行实际工作。

RenderOpacity扩展了RenderProxyBox。这些恰好实现了这些方法,并将实际计算推迟到了唯一的孩子。

double get opacity => _opacity;
double _opacity;
set opacity(double value) {
_opacity = value;
markNeedsPaint();
}

在上面的代码中删除了很多断言/优化。

字段通常向私有变量公开获取器。还有一个设置器,除了设置字段外,还调用markNeedsPaint()或markNeedsLayout()。顾名思义,它告诉系统"嘿,我改变了,请重新粉刷/重新布置我"。

在内部,RenderOpacity我们发现此方法:

@override
void paint(PaintingContext context, Offset offset) {
context.pushOpacity(offset, _alpha, super.paint);
}

同样,删除了优化和断言。

该PaintingContext基本上是一个奇特的画布。在这个精美的画布上,有一种称为pushOpacity的方法。

这一行是实际的不透明度实现。

回顾

  • 该Opacity不是StatelessWidget还是StatefulWidget而是一个SingleChildRenderObjectWidget。
  • 将Widget仅持有该渲染器可以使用的信息。
  • 在这种情况下,Opacity持有代表不透明度的双精度。
  • RenderOpacity,它扩展了RenderProxyBox执行实际布点/渲染等。
  • 由于不透明度的行为与其子对象完全相同,因此它将每个方法调用都委派给该子对象。
  • 它覆盖了paint方法,并调用pushOpacity,它将所需的不透明度添加到小部件。

请记住,小部件仅是配置,并且RenderObject仅管理布局/渲染等

在Flutter中,您基本上总是在重新创建小部件。当您的build()方法被调用时,您将创建一堆小部件。每次更改时都会调用此构建方法。例如,当发生动画时,通常会调用build方法。这意味着您不能每次都重建整个子树。相反,您想更新它。

Element介绍:

Element是一棵大树

第一次创建窗口小部件时,它会膨胀为Element。然后将该Element插入到树中。如果该窗口小部件后来发生更改,则将其与旧窗口小部件进行比较,然后相应地更新Element。重要的是,该Element不会被重建,而只会被更新。

Element是核心框架的核心部分,显然还有更多的内容,但是目前这已经足够了。

更具体的可以看原文...

Flutte 什么是Widget,RenderObjects和Elements的更多相关文章

  1. 【搬运】 Page Object 官方文档 (新增了Widget特性)

    Appium Java client has facilities which components to [Page Object](https://github.com/SeleniumHQ/se ...

  2. Flutter资源

    目录 文章 一开始 HOWTO文档 网站/博客 高级 视频 组件 演示 UI 材料设计 图片 地图 图表 导航 验证 文字和富文本 分析.流量统计 自动构建 风格样式 媒体 音频 视频 语音 存储 获 ...

  3. 2020互联网寒冬之下,作为一个Android老码农,是如何进入腾讯的?

    由于众所周知的原因,原生Android开发如今已经日渐凋敝,作为一个Android程序员,不仅要会Java,Kotlin,JavaScript,Css,Html,还要会Flutter,C++,FFmp ...

  4. 阿里、腾讯、百度、网易、美团Android面试经验分享,拿到了百度、腾讯offer

    基本情况 2021届普通本科,Android开发岗. 此文主要是2020年秋招面试经验汇总,最终拿到了百度.腾讯的offer. 主要包括阿里三面,腾讯四面,百度三面,网易三面,美团一场面完. 阿里(由 ...

  5. Tkinter Listbox(列表框)

    Python - Tkinter Listbox(列表框): 列表框部件用于显示一个项目列表,用户可以选择的项目数   列表框部件用于显示一个项目列表,用户可以选择的项目数. 语法: 这里是一个简单的 ...

  6. appium():PageObject&PageFactory

    Appium Java client has facilities which components to Page Object design pattern and Selenium PageFa ...

  7. Appium+python自动化(十一)- 元素定位秘籍助你打通任督二脉 - 下卷(超详解)

    简介 宏哥看你骨骼惊奇,印堂发亮,必是练武之奇才! 按照上一篇的节目预告,这一篇还是继续由宏哥给小伙伴们分享元素定位,是不是按照上一篇的秘籍修炼,是不是感觉到头顶盖好像被掀开,内气从头上冒出去,顿时觉 ...

  8. JQuery UI Widget Factory官方Demo

    <!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  9. widget jquery 理解

    jquery ui 的所有组件都是基于一个简单,可重用的widget. 这个widget是jquery ui的核心部分,实用它能实现一致的API,创建有状态的插件,而无需关心插件的内部转换. $.wi ...

随机推荐

  1. 「一本通 1.3 例 4」Addition Chains

    Addition Chains 题面 对于一个数列 \(a_1,a_2 \dots a_{m-1},a_m\) 且 \(a_1<a_2 \dots a_{m-1}<a_m\). 数列中的一 ...

  2. LOJ10066

    LOJ10066 新的开始 题目描述 发展采矿业当然首先得有矿井,小 F 花了上次探险获得的千分之一的财富请人在岛上挖了 n 口矿井,但他似乎忘记考虑的矿井供电问题-- 为了保证电力的供应,小 F 想 ...

  3. Golang--Directional Channel(定向通道)

    Directional Channel 通道可以是定向的(directional).在默认情况下,通道将以双向的(bidirectional)形式运作,用户既可以把值放人通道,也可以从通道取出值;但是 ...

  4. 某cms最新版前台RCE漏洞(无需任何权限)2020-03-15

    漏洞文件:application/common/controller/Base.php 中的 getAddonTemplate 方法: 错误的使用了public,导致我们可以直接外部访问. 然后使用了 ...

  5. Redis分布式锁升级版RedLock及SpringBoot实现

    分布式锁概览 在多线程的环境下,为了保证一个代码块在同一时间只能由一个线程访问,Java中我们一般可以使用synchronized语法和ReetrantLock去保证,这实际上是本地锁的方式.但是现在 ...

  6. redis学习教程四《管理、备份、客户端连接》

    redis学习教程四<管理.备份.客户端连接>  一:Redis服务器命令 Redis服务器命令 下表列出了与Redis服务器相关的一些基本命令. 序号 命令 说明 1 BGREWRITE ...

  7. Django(图书管理系统)

    图书管理系统 注意事项 1.models 要创建好,规划好自己的表,以及各种表关系 2.url正则要写好 3.settings的配置 4.利用bootstarp 进行布局更漂亮哦 5.注意orm  各 ...

  8. DolphinScheduler 源码分析之 DAG类

    1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license ...

  9. BZOJ 4516. [Sdoi2016]生成魔咒【SAM 动态维护不同子串数量】

    [Sdoi2016]生成魔咒 动态维护不同子串的数量 想想如果只要查询一次要怎么做,那就是计算各个点的\(len[u]-len[link[u]]\)然后求和即可,现在要求动态更新,我们可以保存一个答案 ...

  10. 【2020杭电多校】Total Eclipse 并查集+思维

    题目链接:Total Eclipse 题意: t组输入,给你一个由n个点,m条边构成的图,每一个点的权值是ai.你每一次可以选择一批联通的点,然后让他们的权值都减去1.问最后把所有点的权值都变成0需要 ...