第四百四十八回


我们在上一章回中介绍了"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用法"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论

相关推荐

  1. 2024-04-09 11:46:04       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-09 11:46:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-09 11:46:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-09 11:46:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-09 11:46:04       18 阅读

热门阅读

  1. 1006 换个格式输出整数

    2024-04-09 11:46:04       13 阅读
  2. Flutter 使用flutter_swiper_null_safety 实现轮播图

    2024-04-09 11:46:04       12 阅读
  3. css不知道宽度,如何绘制一个正方形

    2024-04-09 11:46:04       14 阅读
  4. Getshell sql注入

    2024-04-09 11:46:04       12 阅读
  5. Mysql

    Mysql

    2024-04-09 11:46:04      13 阅读
  6. Integer.parseInt

    2024-04-09 11:46:04       10 阅读
  7. 「Spring」Spring Bean的生命周期

    2024-04-09 11:46:04       16 阅读
  8. 前端qiankun如何实现微应用路由跳转

    2024-04-09 11:46:04       11 阅读
  9. 2024 蓝桥打卡Day35

    2024-04-09 11:46:04       14 阅读