flutter 系列之:flutter 中的幽灵offstage

news/2024/4/28 23:39:16/文章来源:https://blog.csdn.net/superfjj/article/details/127620440

文章目录

  • 简介
  • Offstage详解
  • Offstage的使用
  • 总结

简介

我们在使用flutter的过程中,有时候需要控制某些组件是否展示,一种方法是将这个组件从render tree中删除,这样这个组件就相当于没有出现一样,但是有时候,我们只是不想展示这个widget,但是这个组件还是存在的,并且可以接受键盘输入,还可以使用CPU。它和真正的组件唯一不同的就是他是不可见的。

这样的组件就叫做Offstage。 今天给大家详细介绍一下Offstage的使用。

Offstage详解

我们首先来看下Offstage的定义:

class Offstage extends SingleChildRenderObjectWidget

可以看到,Offstage是一个包含单个child的Widget。接下来看下它的构造函数:

  const Offstage({ Key? key, this.offstage = true, Widget? child }): assert(offstage != null),super(key: key, child: child);

Offstage主要包含两个属性,分别是表示是否是offstage状态的bool值offstage,如果offstage=true,那么Offstage的子child就会处于隐藏状态。这时候子child不会占用任何空间。

剩下的一个属性就是child了。

那么Offstage是如何控制child是否offstage的呢?

我们看下它的createRenderObject方法:

  RenderOffstage createRenderObject(BuildContext context) => RenderOffstage(offstage: offstage);

可以看到返回的是一个RenderOffstage对象,其中接受一个offstage参数。

如果深入研究RenderOffstage的话,可以看到他的paint方法是这样的:

  void paint(PaintingContext context, Offset offset) {if (offstage)return;super.paint(context, offset);}

如果offstage是true的话,paint方法直接返回,不会进行任何的绘制。这也就是Offstage的秘密。

Offstage的使用

从上面讲解的Offstage的构造函数我们知道,Offstage需要一个bool的offstage属性。所以这个offstage属性是可以变换的,从而触发offstage的不同状态。

因为offstage需要这样的一个状态,所以我们在使用offstage的时候,一般来说是创建一个StatefulWidget,从而在StatefulWidget中保持这样的一个offstage属性。

比如我们创建一个OffstageApp,这是一个StatefulWidget,在它的createState方法中,返回一个State<OffstageApp>对象,在createState方法中,我们定义一个_offstage属性。

通过使用这个_offstage,我们可以创建Offstage如下:

Offstage(offstage: _offstage,child: SizedBox(key: _key,width: 150.0,height: 150.0,child: Container(color: Colors.red,),),)

这里我们设置Offstage的offstage为刚刚设置的_offstage。

另外为了展示方便,我们将Offstage的child设置为一个SizedBox,里面包含了一个红色的Container。

SizedBox包含了width和height属性,方便我们后续的测试。

默认情况下,因为_offstage=true,所以这个Offstage是不可见的,那么怎么将其可见呢?

我们提供一个ElevatedButton,在它的onPressed方法中,我们调用setState方法来修改_offstage,如下所示:

ElevatedButton(child: const Text('切换offstage'),onPressed: () {setState(() {_offstage = !_offstage;});},),

另外,我们还需要一个ElevatedButton来检测Offstage的大小,看看在_offstage发生变化的时候,Offstage到底会不会发生变化。

 ElevatedButton(child: const Text('检测SizedBox大小'),onPressed: () {ScaffoldMessenger.of(context).showSnackBar(SnackBar(content:Text('SizedBox is ${_getSizedBoxSize()}'),),);})

这里的_getSizedBoxSize实现如下:

  Size _getSizedBoxSize() {final RenderBox renderBox =_key.currentContext!.findRenderObject()! as RenderBox;return renderBox.size;}

我们通过Offstage的_key,来获取到它的Context,从而找到对应的RenderBox,拿到它的大小。

好了,这样我们的代码就写好了,最后将OffstageApp放到Scaffold中运行,我们可以得到下面的界面:

默认Offstage是不会展示的。

如果我们点击下面的检测SizeBox大小的按钮,可以得到下面的界面:

可以看到虽然Offstage没有展示,但是还是获取到了它的大小。

然后我们点击切换Offstage按钮,可以得到下面的界面:

界面完美的展示了。

总结

Offstage是一个非常方便的组件,可以用来隐藏我们不需要展示的组件,但是仍然可以获得它的大小。

本文的例子:https://github.com/ddean2009/learn-flutter.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_410198.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术革新,取代传统会议模式?原来这么简单

随着AI人工智能的盛行&#xff0c;各领域面临前所未有的技术革新。人脸识别作为人工智能的一项重要技术&#xff0c;为工作及生活带来极大便捷&#xff0c;增效赋能。 人脸签到技术5大优势 01.人脸识别稳定&#xff0c;即使在光源不佳、角度受限的环境下也能精准识别&#xff1…

Libuv 各个回调(异步)事件的调用时机

Libuv 各个回调&#xff08;异步&#xff09;事件的调用时机 uv_close、uv_timer_start uv_close中注册的回调事件&#xff08;close_cb&#xff09;查阅官网API文档&#xff0c;Handle句柄是调用uv_close便会立即关闭&#xff0c;而注册的回调事件将推迟到下一次Loop循环中执…

设计模式——创建型模式

五大-创建型模式一、单例模式1、简介2、单例模式八种方式2.1、饿汉式&#xff08;静态常量&#xff09;2.2、饿汉式&#xff08;静态代码块&#xff09;2.3、懒汉式&#xff08;线程不安全&#xff09;2.4、懒汉式&#xff08;线程安全&#xff0c;加同步方法&#xff09;2.5、…

C2 实验 学习笔记

C2 实验 免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关. C2隐藏技术 CDN 准备 一台 vultr centos7 机器一个域名cloudflare 账号 挂上 cdn 在域名购买后配置&#xff0c;cf 中的域名解析&#xff0c;在 cf 中配置…

「MySQL高级篇」MySQL之MVCC实现原理事务隔离级别的实现

①MVCC定义,用处,快照读,当前读 ②MVCC实现原理:隐藏字段,readview,undo log ③readview访问规则 ④事务隔离级别的具体实现大家好,我是melo,一名大三后台练习生,死去的MVCC突然开始拷打我🤣🤣🤣!🍳引言 MVCC,非常顺口的一个词,翻译起来却不是特别顺口:多…

Fiddler 抓包工具

1 基本使用 官网下载地址&#xff1a;Download Fiddler Web Debugging Tool for Free by Telerik X.1 电脑端监听 我们双击打开软件&#xff0c;进入到如下的一个界面&#xff0c;然后点击某一个请求&#xff0c;你会发现请求的内容是一堆明显不对的文字&#xff0c;然后该请求…

MySQL性能优化和慢查询日志

目标 了解性能优化的方案能够使用慢日志定位慢SQL 讲解 1. 优化方案 1.1 为什么要优化数据库性能 ​ MySQL凭借着出色的性能、低廉的成本、丰富的资源&#xff0c;已经成为绝大多数互联网公司的首选关系型数据库。可以看到Google&#xff0c;Facebook&#xff0c;Twitter&…

【百度地图】百度地图的使用方法 和 在vue中如何使用百度地图(超详细)

【百度地图】百度地图的使用方法 和 在vue中如何使用百度地图&#xff08;超详细&#xff09; 1- 介绍 百度地图功能强大&#xff0c;本篇文章只是对百度地图JavaScript API 进行一个介绍~ 官方网址 百度地图开放平台LBS&#xff1a;LocationBusinessServer 基于定义位置的商…

Spark 离线开发框架设计与实现

一、背景 随着 Spark 以及其社区的不断发展&#xff0c;Spark 本身技术也在不断成熟&#xff0c;Spark 在技术架构和性能上的优势越来越明显&#xff0c;目前大多数公司在大数据处理中都倾向使用 Spark。Spark 支持多种语言的开发&#xff0c;如 Scala、Java、Sql、Python 等。…

Matlab神经网络函数newff()新旧用法差异

在Matlab R2010a版中,如果要创建一个具有两个隐含层、且神经元数分别为5、3的前向BP网络,使用旧的语法可以这样写:net1 = newff(minmax(P), [5 3 1]); 注意minmax()函数的使用,还有对输出层神经元数(1)的指定。当然也可以采用新的语法,更简洁(请留意差异):net2 = new…

形态分类行为中的气泡佯谬

“假设光归根结底是波&#xff0c;只是给我们以粒子的印象&#xff0c;因为粒子吸收光波的能量是以离散的包的方式。波从源头传播出去像一个越来越大正在膨胀的气泡&#xff0c;到达一个原子时&#xff0c;气泡破裂&#xff0c;波坍缩并把所有的能量集中在一个地方&#xff0c;…

【数字式时间继电器】TR-23 DC110V

系列型号 TR-20数字式时间继电器&#xff1b;TR-21数字式时间继电器&#xff1b; TR-22数字式时间继电器&#xff1b;TR-23数字式时间继电器&#xff1b; TR-24数字式时间继电器&#xff1b;TR-25数字式时间继电器&#xff1b; TR-20D数字式时间继电器&#xff1b;TR-21D数字式…

无刷电机控制基础(3)——FOC矢量控制入门

本节我们讲一些无刷电机FOC矢量控制的入门知识。 1&#xff09;FOC矢量控制的作用 我们前两节讲的无刷电机&#xff08;BLDC&#xff09;&#xff0c;是最简单的结构&#xff0c;当转子匀速转动时&#xff0c;定子内产生的反电动势是梯形波&#xff1b;在驱动无刷电机转动时&a…

你不知道的JavaScript-----强制类型转换

目录 值类型转换 抽象值的操作 JSON 字符串化 ToNumber&#xff1a; 非数字值到数字值 Number(value) ToBoolean: 转换为布尔类型 Boolean(value) 强制类型转换 字符串和数字之间的显式强制类型转换 奇特的~运算符 字位截除 显式解析数字字符串 显式转换为布尔值 隐…

Mybatis查询返回结果类型专题

文章目录一、返回一条信息二、返回List集合三、返回Map集合四、返回多个Map集合五、返回List集合一、返回一条信息 Student selectById(Long id); 不再赘述 二、返回List集合 List< Student> selectAll(); 不再赘述 三、返回Map集合 用map集合去接收返回来的结果 字…

Python-- list(列表)的使用

目录 1.合并两个有序序列构成一个有序列表 2.编写程序判断列表是否为升序 3.输入一个十进制转换为二进制输出 4.将列表中的前p个元素到尾列表 1.合并两个有序序列构成一个有序列表 代码如下&#xff1a; list1 list(eval(input("请输入有序列表list1:"))) list…

【飞桨PaddleSpeech语音技术课程】— 一句话语音合成全流程实践

(以下内容搬运自飞桨PaddleSpeech语音技术课程&#xff0c;点击链接可直接运行源码) 一句话语音合成全流程实践 点击播放视频 1 声音克隆介绍 & 语音合成基本概念回顾 语音合成&#xff08;Speech Sysnthesis&#xff09;&#xff0c;又称文本转语音&#xff08;Text-t…

Web前端:angular对比React——选择2022年Web开发的理想框架

Javascript世界中的框架列表不断增长和变化&#xff0c;但有两个框架从其他框架中脱颖而出。Angular和React是市场上最受欢迎的框架之一&#xff0c;代表了创建web应用程序和网站的两种不同方法。 试图利用web开发框架的开发人员和企业家现在正在分析Angular和React——这两种方…

软考下午题第2题——E-R图 UML图 逻辑结构设计-示题与解析

下午的第二题主要是找【属性】【主键】【外键】【候选键】之间的关系。 候选键&#xff1a;属性或者是属性组合&#xff0c;其值能够唯一地标识一个元组 主键&#xff1a;在一个关系中可能有多个候选键&#xff0c;从中选择一个作为主键 外键&#xff1a;如果一个关系中的属性或…

微机期末复习指导

目录 位扩展定义字扩展定义1、线选法定义优点缺点2、部分译码法定义3、全译码法定义优点缺点⭐字位扩展定义问题