第四百四十八回

news2024/11/27 3:37:08

文章目录

  • 1. 知识回顾
  • 2. 使用方法
  • 3. 代码与功能
    • 3.1 示例代码
    • 3.2 功能说明
  • 4. 内容总结

我们在上一章回中介绍了"overlay_tooltip简介"相关的内容,本章回中将介绍OverlayTooltip用法.闲话休提,让我们一起Talk Flutter吧。

在这里插入图片描述

1. 知识回顾

我们在上一章回中介绍了overlay_tooltip包的功能以及包中相关的组件,该包提供了OverlayTooltip和OverlayTooltipScaffold两个组件,前者用来解释页
面中某个功能的用法,后者用来管理页面中的OverlayTooltip。该包主要用来实现首次使用引导,实现该功能的整体思路就是在页面中某个功能所在的位置插入一个
OverlayTooltip,用来解释该功能的使用方法。因为首次使用引导功能包含多个功能的使用方法,所以在整个页面上使用包中的组件(OverlayTooltipScaffold)
来管理所有的OverlayTooltip。

2. 使用方法

  • 创建TooltipController对象,用来管理Tooltip;
  • 创建OverlayTooltipScaffold组件,并且把页面的Scaffold组件赋值给它的builder属性;
  • 配置OverlayTooltipScaffold组件的controller,startWhen和preferredOverlay等属性;
  • 在builder属性对应的scaffold组件中添加OverlayTooltipItem组件,用来显示OverlayTooltip;
  • 在页面销毁时释放TooltipController对象,以名引起内存泄漏;
    上面的步骤中大家重点关注一下startWhen和preferredOverlay属性;前者用来控制OverlayTooltip的启动时机,后者用来显示模糊层,通常会在模糊层上添加
    点击事件,这样就可以在点击模糊层的时候切换不同的OverlayTooltip。大家可能觉得这些内容比较抽象,我们将在后面的小节中通过示例代码来演示。

3. 代码与功能

3.1 示例代码

final TooltipController tooltipController = TooltipController();
bool done = false;


void initState() {
  tooltipController.onDone(() {
    setState(() {
      done = true;
    });
  });
  super.initState();
}


void dispose() {
  tooltipController.dispose();
  super.dispose();
}

OverlayTooltipScaffold(
  controller: tooltipController,
  startWhen: (initValue) async {
    debugPrint("start tool tip value:$initValue");
    await Future.delayed(const Duration(seconds: 1,),);
    debugPrint(" 1s later start tool tip value:$initValue");
    ///这个3是tips的数量,它值是最后一个toolTip的值加1: displayIndex: 2,
    return initValue == 3 && !done;
},
   overlayColor: Colors.blueAccent,
  ///第个点击后跳转到下一个tip的时间
  tooltipAnimationDuration: const Duration(milliseconds: 100),
  ///这个是在模糊层上(除了tooltip位置外)任意位置上点击时的事件,它主要用来切换不同的tooltips
  preferredOverlay: GestureDetector(
    onTap: () {
      // ///跳转到最后一个tips的时候停止跳转
       if(tooltipController.nextPlayIndex == 1) {
         debugPrint("stop tips");
         tooltipController.dismiss();
       } else {
         debugPrint("next tips");
         tooltipController.next();
       }
    },
    child: Container(
      width: double.infinity,
      height: double.infinity,
      color: Colors.yellowAccent.withOpacity(.8),
    ),
  ),
  builder: (BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        actions: [
          SizedBox(
            width: 80,
            child: TextButton(
                onPressed: () {},
                child: const Text("action1")),
          ),
          ///在这里加入toolTip 1
          OverlayTooltipItem(
              displayIndex: 0,
              tooltipVerticalPosition: TooltipVerticalPosition.TOP ,
              tooltip: (tooltipController) {
                debugPrint("show tool tip tips");
                return const Padding(padding: EdgeInsets.all(16),
                  ///toolTip显示的内容,可以看作是对child中内容的解析,tooltip消失后它会随之消失
                  child: Text("this is tool tip1"),
                );
              },
              ///需要显示toolTip的内容,这个值会一直显示在,它是页面上正常的内容
              child: const Text("index 0 Tip")),
        ],
      ),
      body: Column(
        children: [
          ///充当标题
          const Center(
            child: Text(" Picked image and video"),
          ),

      
          ElevatedButton(
            onPressed: () {},
            child: const Text("Pick Image by Camera"),
          ),
          ///在这里加入toolTip 2
          OverlayTooltipItem(
              displayIndex: 1,
              tooltip: (tooltipController) {
                debugPrint("show tool tip tips");
                return const Padding(padding: EdgeInsets.all(16),
                  child: Text("this is tool tip2",),
                );
              },
              child: const Text("index 1 Tip")),
          const SizedBox(height: 120,),
          ///在这里加入toolTip 3
          OverlayTooltipItem(
              displayIndex: 2,
              tooltipVerticalPosition: TooltipVerticalPosition.BOTTOM,
              tooltip: (tooltipController) {
                debugPrint("show tool tip tips2");
                return Padding(padding: const EdgeInsets.all(16),
                  ///toolTip显示的内容,可以看作是对child中内容的解析,tooltip消失后它会随之消失
                  child: Column(
                    children: [
                      ///这个只是为了显示漂亮而加的装饰框
                      Container(
                          color: Colors.greenAccent,
                          padding: const EdgeInsets.all(8),
                          child: const Text("this is tool tip2")),
                      ///专门指定了一个按钮点击时切换到下一个tip
                      ElevatedButton(
                        onPressed:() { tooltipController.next();},
                        style: ElevatedButton.styleFrom(
                          shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16),
                              side: const BorderSide(
                                color: Colors.white,
                                width: 2,
                              ),
                          ),
                          backgroundColor: Colors.black,
                          foregroundColor: Colors.white),
                        child: const Text("Next",),
                      ),
                    ],
                  ),
                );
              },
              ///需要显示toolTip的内容,这个值会一直显示在,它是页面上正常的内容
              ///这个只是为了显示漂亮而加的装饰框
              child: Container(
                padding: const EdgeInsets.all(8),
                decoration: BoxDecoration(borderRadius: BorderRadius.circular(90),color: Colors.white),
                  child: const Text("index 2 Tip"))),
        ],
      ),
    );
  },
);

上面的示例代码完全按照实现方法中的内容来实现,我们在代码中的关键位置添加了注释,这样方便大家理解代码。代码中添加了三个OverlayTooltipItem,分别位于
页面的AppBar,按钮上。也就是说这些toolTip会对AppBar和按钮做功能解释,不过示例中没有对功能做解释,只是简单地显示一个文本。编译并且运行上面的程序可以
看到整个页面呈现模糊层,首先是在页面的AppBar位置显示ToolTip,点击模糊层后切换到下一个ToolTip,直到最后一个ToolTip时停止显示模糊层,页面恢复正常。
我在这里注不演示程序的运行结果了,建议大家自己动手去实践一下。

3.2 功能说明

本小节中我们重点说一下示例代码中的相关功能,这些功能比较重要,而且包含很多细节:

  • 启动功能:该功能对应startWhen属性,它除了在页面的initState()方法中启动Overlay外,还包含toolTip的数量,因为该属性是方法类型,所以通过方法的
    参数传递toolTip的数量;当该属性对应的方法返回true时才可以启动Overlay.示例代码中对启动条件加了两个条件:一个是done为true,它表示页面初始化完成了;
    另外一个是tooltip的数量等于3.它表示显示的toolTip的实际页面中的tooltip数量相同。
  • 模糊层:该功能主要显示一个模糊图层,可以控制图层的颜色和透明度,还可以在图层响应事件,示例代码中就添加了事件响应功能;
  • OverlayTooltipItem的tooltip属性:它是Widget类型,可以自定义组件,也就是说对某个功能进行解释时可以显示成方矩形文本,圆形文件,或者向对话框窗口
    一样,示例代码中前两个toolTip功能比较简单,第三个toolTip做了包含详细的自定义功能。

4. 内容总结

最后,我们对本章回的内容做一个全面总结:

  • 我们可以使用OverlayTooltip来解释页面中的某个功能;
  • 我们可以使用OverlayTooltipScaffold管理页面中所有的OverlayTooltip;
  • 在使用OverlayTooltipScaffold时注意它的启动功能,模糊层功能;
  • 在使用OverlayTooltip时可以用它默认的文本来解释功能,也可以添加自定义的组件;
    看官们,与"OverlayTooltip用法"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql底层原理五:如何设计、用好索引

1.索引的代价 空间上的代价 时间上的代价 每次对表中的数据进⾏增、删、改操作时,都需要去修改各个B树索引。⽽且我们讲过,B树每层节点都是按照索引列的值从⼩到⼤的顺序排序⽽组成了双 向链表。不论是叶⼦节点中的记录,还是内节点中的记录&a…

Win10下VirtualBox启动任何一个虚拟机马上出现蓝屏死机(终止代码:SYSTEM_SERVICE_EXCEPTION)

环境: Win10专业版 VirtualBox5.1.28 问题描述: Win10下VirtualBox启动任何一个虚拟机马上出现蓝屏死机(终止代码:SYSTEM_SERVICE_EXCEPTION),之前都一直没问题 检查下面功能是否开启 已启用 Credential Guard/Device Guard。 已启用 Windows 沙箱 已启用虚拟机平台…

二维码门楼牌管理应用平台:实现精细化、智能化场所管理

文章目录 前言一、二维码门楼牌管理应用平台的构建二、场所任务的精细化管理三、消防检查与整改的智能化管理四、二手交易登记的便捷化管理五、未来展望 前言 随着城市管理的日益精细化,二维码门楼牌管理应用平台应运而生。通过这一平台,场所负责人可以…

2024-04-08 NO.6 Quest3 自定义交互事件

文章目录 1 交互事件——更改 Cube 颜色2 交互事件——创建 Cube2.1 非代码方式2.2 代码方式 ​ 在开始操作前,我们导入上次操作的场景,相关介绍在 《2024-04-08 NO.5 Quest3 手势追踪进行 UI 交互-CSDN博客》 文章中。 1 交互事件——更改 Cube 颜色 …

知识管理系统|基于Springboot和vue的知识管理系统设计与实现(源码+数据库+文档)

知识管理 目录 基于Springboot和vue的知识管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、前台: 5.2.2 文章信息 5.3.1 论坛交流 2、后台 用户管理 5.1.2 文章分类 5.2.1 资料分类 四、数据库设计 五、核心代码 六、论文参考 七、最…

【游戏逆向】游戏全屏捡物的实现

0x0前言: 在角色对战类中,拾取怪物掉落的装备是一项必备的工作,由于装备位置掉落的不确定性,玩家想要拾取离角色距离较远的装备需要一定的时间,这一段时间往往会影响游戏的评分或是玩家的心态,基于此&…

CasaOS玩客云部署AList+Aria2结合内网穿透实现公网离线下载文件至网盘

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-cdH8fnSF05FmvunX {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

第四十七周:文献阅读+AGCN+Wavenet network

目录 摘要 Abstract 文献阅读:结合自适应图卷积和CNN-LSTM的多站点水质预测模型 现有问题 提出方法 方法论 Adaptive graph convolution network(自适应图卷积网络) WaveNet network(WaveNet网络) CNN-LSTM混…

一文搞懂从爬楼梯到最小花费(力扣70,746)

文章目录 题目前知动态规划简介动态规划模版 爬楼梯一、思路二、解题方法三、Code 使用最小花费爬楼梯一、思路二、解题方法三、Code 总结 在计算机科学中,动态规划是一种强大的算法范例,用于解决多种优化问题。本文将介绍动态规划的核心思想&#xff0c…

HarmonyOS 应用开发之@Concurrent装饰器:@Sendable装饰器:声明并校验Sendable类

简介 在使用 TaskPool 时,执行的并发函数若需要传输类对象且使用该类的内部方法,该类需要使用此装饰器修饰,否则无法使用此对象内的方法。SendableClass有以下两种行为: 支持SendableClass序列化。对象分配在各自的虚拟机内存空间…

axios是什么?axios使用axios和ajax

Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js 环境。它是由 GitHub 用户 mzabriskie 开发的,并且得到了广泛的社区支持。Axios 的设计目标是提供一种简洁、易用且功能强大的 HTTP 请求方式,以替代传统的 Ajax(A…

very_easy_sql-攻防世界

题目 抓包发现use.php文件 页面说"you are not an inner user, so we can not let you have identify~",就是说只能内部访问登录。这里抓包还看到返回包里有个set-cookie,说明是ssrf造成的sql注入 SSRF(Server-Side Request Forgery:服务器端请求伪造) 是…

docker 搭建多个Linux系统环境 安装多个不同语言的项目

docker 搭建多个Linux系统环境 安装多个不同语言的项目 宝塔dockers可视化界面 https://blog.51cto.com/u_16213709/9473968

stack和queue的使用

前言 前面我们对string、vector、list做了介绍并对底层进行了实现!本期我们继续来介绍STL容器,stack和queue! 本期内容介绍 stack 常用接口的介绍 queue 常用接口的介绍 什么是stack? 这里的栈和我们C语言实现的数据结构的那个栈功能是一样…

3d建图与定位(4)_lio sam代码阅读

一.概述: 1.lio sam 是一个imu与lidar的紧耦合框架 2.前端:imu主要用来预计分,对后端里程计进行位姿推测得到先验位姿 ,对雷达进行畸变校正,特征点提取得到cloudinfo 3.后端主要有两个模块:模块一通过前端位姿初值进行scan->map的匹配 通过lm算法计算更新后端位姿,将后端odo…

景芯2.5GHz A72训练营dummy添加(一)

景芯A72做完布局布线之后导出GDS,然后进行GDS merge,然后用Calibre对Layout添加Dummy。在28nm以及之前的工艺中,Dummy metal对Timing的影响不是很大,当然Star RC也提供了相应的解决方案,可以考虑Dummy metal来抽取RC。…

[StartingPoint][Tier2]Archetype

Task 1 Which TCP port is hosting a database server? (哪个端口开放了数据库服务) $ nmap 10.129.95.187 -sC --min-rate 1000 1433 Task 2 What is the name of the non-Administrative share available over SMB? (哪个非管理共享提供了SMB?) $ smbclient -N -L 1…

Deformable Convolutional Networks论文阅读

Deformable Convolutional Networks论文阅读 Abstract1. Introduction2. Deformable Convolutional Networks2.1. Deformable Convolution2.2. Deformable RoI Pooling 总结 文章信息: 原文链接:https://arxiv.org/abs/1703.06211 源代码:htt…

2024.4.8-day12-CSS 常用样式属性和字体图标

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 作业2024.4.8-学习笔记盒子阴影文本阴影透明的vertical-align字体使用 作业 &…

谷歌浏览器插件开发速成指南:弹窗

诸神缄默不语-个人CSDN博文目录 本文介绍谷歌浏览器插件开发的入门教程,阅读完本文后应该就能开发一个简单的“hello world”插件,效果是出现写有“Hello Extensions”的弹窗。 作为系列文章的第一篇,本文还希望读者阅读后能够简要了解在此基…