【译】flutter中如何较好地实现隐藏和显示widget
2024-09-03 10:30:34
通常情况下,显示有四种情况:
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
最新文章
- 用C#缩小照片上传到各种空间
- win7 WindowsImageBackup 无法识别
- Java 线程的转换及状态
- 设计一个Stack,要求Push、Pop、获取最大最小值时间复杂度都为O(1)
- 四、BLE(中)
- C# LIST列表的使用
- 剑指Offer 合并两个排序的链表
- custom struts framework
- Vue.js学习 Item9 – 表单控件绑定
- Math.sqrt
- php empty()和isset()的区别<;转载>;
- linux内核源码结构
- 前端制作中,IE6还有必要兼容吗?
- sqlite 的基本使用1
- 关于json_encode转数组为json对象时里有数组格式数据的问题
- 替罪羊树&;&;非旋treap
- TypeScript 模块系统
- [No0000C7]windows 10桌面切换快捷键,win10
- Git clone 常见用法
- JS获取当前/指定URL参数
热门文章
- Maven项目导入Intellij IDEA
- java基础---java8 新特性
- DHCP原理于配置
- 【LeetCode】283.移动零
- 【LeetCode】94. 二叉树的中序遍历
- MySql存储过程的创建与使用及在thinkphp中如何调用笔记
- 计算机基础-Socket
- tomcat内置jdk(tomcat集成jdk)(windows环境)
- &#39;utf-8&#39; codec can&#39;t decode byte的解决办法
- 使用分区助手转移windows 10系统出现黑屏boot manager报错问题。