通常情况下,显示有四种情况:

1、(visible)显示

2、(invisible)隐藏:

这种隐藏是指在屏幕中占据空间,只是没有显示。这种情况出现场景如:用带有背景色的Container Widget去包含一个不可见的Image,当从网络中加载图片后才让它显示,这是为了避免图片显示后让页面布局改变发生跳动。

3、(Offscreen)超出屏幕,同样占据空间

4、(Gone)消失:

这种是指Widget没有被rendered,不存在于wedget tree中

考虑到显示隐藏带来的代价,所以我们在控制显示隐藏最好的起始出发点是不要让widget出现在wedget tree中。

伪代码如下:

List<Widge> views = []
if(shouldBeIncluded) {
views.add(myView);
}
// use views later

当决定使用哪种方式时,应该考虑一下几个问题:

1、该widget是否只显示一次,譬如在app启动的时候,这时应该使用第四种,即Gone方式

2、是否需要让该widget一直占据空间或者当该widget隐藏是否会影响其他widget?如果是的或可以使用第二种,即invisible。

3、当该widget不可见的时候,在计算大小的时候是否依然计算该widget?是的话用第三种,及Offscreen

总结以上,示例代码如下:

import 'package:flutter/widgets/dart';
import 'package:meta/meta.dart'; enum VisibilityFlag {
visible,
invisible,
offscreen,
gone,
} class Visibility extends StatelessWidget {
final Visibility visibility;
final Widget child;
final Widget removeChild; Visibility({
@retuired this.child,
@required this.visibility,
}) : this.removeChild = Container(); @override
Widget build(BuildContext context) {
if(visibility == VisibilityFlag.visible) {
return child;
}else if(visibility == VisibilityFlag.invisible) {
return new IgnorePointer(
ignoring: true,
child: new Opacity(
opcity: 0.0,
child: child
)
);
}else if(visibility == VisibilityFlag.offscreen) {
return new Offstage(
offstage: true,
child: child
);
}else{
return removeChild;
}
}
}

以上代码的解释如下:

1、对于visible: 什么也不做

2、对于Invisible: 用IgnorePointer 和Opacity widget包裹,并将opacity的值设置为0

3、对于offscreen:用Offstage widget包裹使得widget在屏幕外显示

4、直接返回没有大小初始值container widget,可以根据需要自行更改另外的widget

【译】flutter中如何较好地实现隐藏和显示widget的更多相关文章

  1. 从 QSplitter 中移除 QWidget(使用隐藏与显示,切换十分方便,不要真正销毁)

    Splitter 的函数中有addWidget,但是却没有removeWidget, 或者delete之类的功能,所以如果想删去或者暂时不显示其中的某些widget就要自己手动完成这个效果.方法一:取 ...

  2. [译]Flutter JSON和序列化

    [译]Flutter JSON和序列化   很难想象一个移动应用程序不需要与Web服务器通信或在某些时候容易存储结构化数据.制作网络连接的应用程序时,迟早需要消耗一些好的旧JSON. 本指南介绍了如何 ...

  3. 在Flutter中嵌入Native组件的正确姿势是...

    引言 在漫长的从Native向Flutter过渡的混合工程时期,要想平滑地过渡,在Flutter中使用Native中较为完善的控件会是一个很好的选择.本文希望向大家介绍AndroidView的使用方式 ...

  4. 从零学习Fluter(五):Flutter中手势滑动拖动已经网络请求

    从六号开始搞Flutter,到今天写这篇blog已经过了4天时间,文档初步浏览了一遍,写下了这个demo.demo源码分享在github上,现在对flutter有种说不出的喜欢了.大家一起搞吧! 废话 ...

  5. Flutter 中 JSON 解析

    本文介绍一下Flutter中如何进行json数据的解析.在移动端开发中,请求服务端返回json数据并解析是一个很常见的使用场景.Android原生开发中,有GsonFormat这样的神器,一键生成Ja ...

  6. mvp 在 flutter 中的应用

    在 Android 应用程序开发过程中,我们经常会用到一些所谓的架构方法,如:mvp,mvvm,clean等.之所以这些方法会被推崇是因为他们可以大大的解耦我们的代码的功能模块,让我们的代码在项目中后 ...

  7. Flutter 中文文档网站 flutter.cn 正式发布!

    在通常的对 Flutter 介绍中,最耳熟能详的是下面四个特点: 精美 (Beautiful):充分的赋予和发挥设计师的创造力和想象力,让你真正掌控屏幕上的每一个像素. ** 极速 (Fast)**: ...

  8. 理解 Flutter 中的 Key

    概览 在 Flutter 中,大概大家都知道如何更新界面视图: 通过修改 Stata 去触发 Widget 重建,触发和更新的操作是 Flutter 框架做的. 但是有时即使修改了 State,Flu ...

  9. flutter 中的样式

    flutter 中的样式 样式 值 width 320.0 height 240.0 color Colors.white,Colors.grey[300] textAlign TextAlign.c ...

随机推荐

  1. 为什么0x100是256个字节、0x400是1KB、0x800是2KB、0x1000是4KB?

    [TOC] # 前言在刚开始学习嵌入式时我们就遇到各种进制之间的换算,十六进制.十进制.八进制.二进制等等,一开始会经常在各种进制之间迷失自我:在深入学习或者做项目或者工作时我们也经常要查看各种芯片的 ...

  2. pxe+kickstart部署多个版本的Linux操作系统(下)---实践篇

        我们在企业运维环境中,难免会遇到使用多个Linux操作系统的情况,如果每天都需要安装不同版本的Linux系统的话,那么使用Kickstart只能安装一种版本的Linux系统的方法则显得有些捉襟 ...

  3. 一次性讲清楚spring中bean的生命周期之三:bean是如何实例化的

    在前面的两篇博文<一次性讲清楚spring中bean的生命周期之一:getSingleton方法>和<一次性讲清楚spring中bean的生命周期之二:FactoryBean的前世今 ...

  4. FTP传输

    FTP传输                    一.FTP服务–用来传输文件的协议                    二.设置匿名用户访问的FTP服务(最大权限)                 ...

  5. scrapy::Max retries exceeded with url

    运行scrapy时出错这个错误:Max retries exceeded with url解决方法: img1=requests.get(url=aa,headers=header1,timeout= ...

  6. 开源桌面快速启动工具-GeekDesk

    GeekDesk 小巧.美观的桌面快速启动工具 开发框架 wpf .net 4.7.2 HandyControl 全局热键 鼠标跟随 快速启动 随时随地 支持自定义热键 支持鼠标跟随 自定义壁纸 随意 ...

  7. 【剑指offer】51.构建乘积数组

    51.构建乘积数组 知识点:数组: 题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0] * A[1] *... * A[i ...

  8. 使用xampp在本地环境配置虚拟域名

    最近在学习ThinkPHP5.1.手册里面提到"实际部署中,应该是绑定域名访问到public目录,确保其它目录不在WEB目录下面."所以把使用xampp在本地配置虚拟域名的过程记录 ...

  9. P5147-数学-随机数生成器

    P5147-数学-随机数生成器 (洛谷第一篇题解说这是高一数学题,新高二感觉到被吊打) 我们设work(x)的期望值为\(f_x\) 注意\(f_1\)是边界.不过对下列式子没有影响.原因参照必修的数 ...

  10. Angular封装WangEditor富文本组件

    富文本组件是web程序中很常用的一个组件,特别是要开发一个博客,论坛这类的网站后台. 得益于Angular的强大,封装WangEditor组件非常简单 1.使用yarn或者npm安装wangedito ...