• 【译】flutter中如何较好地实现隐藏和显示widget


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

    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

  • 相关阅读:
    Flink核心技术
    Flink学习问题和答案
    Spark知识点总结
    Scala知识点总结
    Spark测试题
    Hadoop概念试题
    IntelliJ IDEA 2019 快捷键终极大全
    Linux入门
    javaSe知识点总结
    Data
  • 原文地址:https://www.cnblogs.com/pjl43/p/9615685.html
Copyright © 2020-2023  润新知