当前位置: 首页 > article >正文

Flutter Visibility控件详解

在这里插入图片描述

文章目录

      • 1. `Visibility` 的基本定义
        • 构造函数:
        • 主要参数:
      • 2. 基本用法
        • 示例 1:简单的 `Visibility` 使用
        • 解释:
      • 3. `maintainSize` 使用场景
        • 示例 2:使用 `maintainSize` 保留空间
        • 解释:
      • 4. `maintainAnimation` 和 `maintainState` 使用场景
        • 示例 3:使用 `maintainAnimation` 和 `maintainState`
        • 解释:
      • 5. **`Visibility` 和 `Offstage` 的区别**
      • 6. **总结**

Visibility 是 Flutter 中用于控制子控件显示与隐藏的控件。它的作用是控制某个子控件是否在界面上显示,并且可以选择是否保留该控件占用的空间。这个控件非常适合需要动态展示或隐藏内容的场景,比如表单的输入字段、弹出提示、加载指示器等。

1. Visibility 的基本定义

Visibility 控件用于包装子控件,通过控制 visible 参数来决定子控件是否可见。该控件的最大特点是:即使子控件被隐藏,它仍然会占据布局中的空间,除非你显式地设置 maintainSizemaintainAnimationmaintainState 等参数。

构造函数:
Visibility({
  Key? key,
  this.visible = true,               // 控制是否显示子控件
  this.maintainSize = false,         // 是否保持子控件的空间
  this.maintainAnimation = false,    // 是否保持子控件的动画
  this.maintainState = false,        // 是否保持子控件的状态
  this.maintainSemantics = false,    // 是否保持子控件的语义
  required this.child,               // 需要控制显示与隐藏的子控件
})
主要参数:
  • visible: 控制子控件是否可见。如果设置为 true,子控件会显示;如果设置为 false,子控件会隐藏,但仍然占用布局空间,默认值为 true
  • maintainSize: 设置为 true 时,即使控件不可见,仍会保持其大小。这意味着即使控件隐藏了,它仍然会占用其原本的位置和空间。
  • maintainAnimation: 设置为 true 时,隐藏控件时,控件的动画(如 OpacitySlide)会继续运行,即使控件不可见。
  • maintainState: 设置为 true 时,子控件的状态(如 StatefulWidget 的状态)将保持,即使控件被隐藏。
  • maintainSemantics: 控制隐藏时是否保持语义,默认情况下,子控件隐藏时会移除语义信息,设置为 true 会保留。

2. 基本用法

示例 1:简单的 Visibility 使用
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool _isVisible = true;

  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Visibility Example')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Visibility(
                visible: _isVisible,  // 控制文本显示与隐藏
                child: Text('This text is visible or hidden'),
              ),
              ElevatedButton(
                onPressed: () {
                  setState(() {
                    _isVisible = !_isVisible;  // 切换文本可见性
                  });
                },
                child: Text(_isVisible ? 'Hide Text' : 'Show Text'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
解释:
  • _isVisible 控制 Visibility 控件的可见性,点击按钮切换文本的显示与隐藏。

3. maintainSize 使用场景

当你希望控件隐藏时仍然保留原来的布局空间时,可以使用 maintainSize 参数。

示例 2:使用 maintainSize 保留空间
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool _isVisible = true;

  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Visibility with maintainSize')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Visibility(
                visible: _isVisible,
                maintainSize: true, // 保持空间
                child: Container(
                  width: 200,
                  height: 100,
                  color: Colors.blue,
                ),
              ),
              ElevatedButton(
                onPressed: () {
                  setState(() {
                    _isVisible = !_isVisible; // 切换可见性
                  });
                },
                child: Text(_isVisible ? 'Hide Container' : 'Show Container'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
解释:
  • 即使容器不可见,maintainSize: true 会保持容器的大小和位置,从而让其占用空间。

4. maintainAnimationmaintainState 使用场景

  • maintainAnimation: 当隐藏一个控件时,默认控件的动画也会停止。如果你希望控件的动画在隐藏时继续进行,可以设置为 true
  • maintainState: 当控件隐藏时,StatefulWidget 的状态会被保留,不会被销毁。这样当控件重新显示时,它会恢复到原来的状态。
示例 3:使用 maintainAnimationmaintainState
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool _isVisible = true;
  double _opacity = 1.0;

  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Visibility with Animation and State')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Visibility(
                visible: _isVisible,
                maintainAnimation: true, // 保持动画
                maintainState: true, // 保持状态
                child: AnimatedOpacity(
                  opacity: _opacity,
                  duration: Duration(seconds: 1),
                  child: Container(
                    width: 200,
                    height: 100,
                    color: Colors.blue,
                  ),
                ),
              ),
              ElevatedButton(
                onPressed: () {
                  setState(() {
                    _isVisible = !_isVisible;
                    _opacity = _isVisible ? 1.0 : 0.0;  // 动画改变透明度
                  });
                },
                child: Text(_isVisible ? 'Hide Container' : 'Show Container'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
解释:
  • 使用 AnimatedOpacity 控件来控制容器的透明度,并通过按钮来切换透明度和可见性。
  • 设置 maintainAnimation: true,即使容器不可见,动画依然会继续。
  • 设置 maintainState: true,即使容器被隐藏,控件的状态也会被保留。

5. VisibilityOffstage 的区别

  • Visibility: 控件被隐藏时依然占据布局空间,可以选择是否保留动画、状态等信息。
  • Offstage: 另一个用于隐藏控件的控件。当控件被隐藏时,它不仅不显示,也不占据任何空间。

Visibility 更加灵活,允许控制隐藏控件时是否占据空间,而 Offstage 适合不想占用空间的情况。


6. 总结

  • Visibility 控件用于控制子控件的显示与隐藏,可以保持布局空间,控制动画、状态和语义信息。
  • 通过设置 maintainSizemaintainAnimationmaintainState 等参数,可以更加精细地控制控件隐藏时的行为。
  • 适用于动态控制 UI 中某些元素的可见性,常用于表单输入、加载提示等场景。

Visibility 是 Flutter 中非常实用的控件,帮助我们根据需求灵活管理子控件的可见性和布局行为。


结束语
Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!


http://www.kler.cn/a/448999.html

相关文章:

  • 车载网关性能 --- GW ECU报文(message)处理机制的技术解析
  • 信创技术栈发展现状与展望:机遇与挑战并存
  • 数据结构经典算法总复习(下卷)
  • JVM简介—1.Java内存区域
  • 西游记战力排名、笔记等
  • 什么?Flutter 可能会被 SwiftUI/ArkUI 化?全新的 Flutter Roadmap
  • 天锐绿盾加密软件与Ping32两款企业防泄密软件对比:分析文件防止泄露解决方案
  • Qt获取本地计算的CPU温度
  • AI在生活各处的利与弊
  • 青少年编程与数学 02-004 Go语言Web编程 17课题、静态文件
  • STM32完全学习——SPI接口的FLASH(DMA模式)
  • 使用GPT进行SCI论文润色常用语句
  • 【医学分割】跨尺度全局状态建模和频率边界指导的分割架构
  • APDL实体模式个性化画网格
  • (15)CT137A- 按键消抖设计
  • Linux Shell 脚本编程基础
  • VIVO Android面试题及参考答案
  • Sigrity SystemSI仿真分析教程文件路径
  • B2HGraphicBufferProducer和H2BGraphicBufferProducer
  • 专题八:背包问题
  • Windows查看MD5
  • 跨越平台界限:探索Native AOT的交叉编译技术
  • Android 动画深度解析
  • 【Chrome Extension】二、导航栏快速查询
  • 探索CSDN博客数据:使用Python爬虫技术
  • 有没有检测吸烟的软件 ai视频检测分析厂区抽烟报警#Python