Flutter高级提示框插件super_tooltip_ext的使用

Flutter高级提示框插件super_tooltip_ext的使用

SuperTooltip 是从我为一位客户编写的组件演变而来。它非常灵活,允许你在屏幕的覆盖层中显示工具提示。整个屏幕会被一个通常是半透明的背景色覆盖。点击背景可以关闭工具提示。

开发者信息

  • 作者:Thomas Burkhart
  • 概念及版权:Marcelo Glasberg
  • 许可证:MIT

工具提示必须在 StatefulWidget 中创建,并且该组件应该是工具提示显示的目标。在示例中,我们通过响应触摸事件来显示工具提示。

// 我们在首次使用时创建工具提示
tooltip = SuperTooltip(
  popupDirection: TooltipDirection.down,
  content: new Material(
      child: Text(
        "Lorem ipsum dolor sit amet, consetetur sadipscingelitr, "
        "sed diam nonumy eirmod tempor invidunt ut laboreet dolore magna aliquyam erat, "
        "sed diam voluptua. At vero eos et accusam et justoduo dolores et ea rebum. ",
    softWrap: true,
  )),
);

tooltip.show(context);

传递的 context 的中心定义了工具提示箭头的目标。 由于此小部件有许多功能,这里不会一一列举。请参阅 API 文档和源代码注释。

接下来展示一些功能。第一个示例使用了所有默认值。

让我们添加一个红色的关闭按钮,使弹出窗口向右对齐,并限制其宽度:

// 我们在首次使用时创建工具提示
tooltip = SuperTooltip(
  popupDirection: TooltipDirection.right,
  maxWidth: 200.0,
  showCloseButton: ShowCloseButton.inside,
  closeButtonColor: Colors.red,
  content: new Material(
      child: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Text(
          "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, "
          "sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, "
          "sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. ",
    softWrap: true,
  ),
);

让我们将气泡固定在一个位置,并将关闭按钮移到外部,同时移除阴影:

tooltip = SuperTooltip(
  popupDirection: TooltipDirection.up,
  top: 50.0,
  right: 5.0,
  left: 100.0,
  showCloseButton: ShowCloseButton.outside,
  hasShadow: false,
  content: new Material(
      child: Padding(
        padding: const EdgeInsets.all(0.0),
        child: Text(
          "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, "
          "sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, "
          "sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. ",
    softWrap: true,
  ),
      )),
);

也许你希望允许用户触摸覆盖层下方的区域而不关闭工具提示?打开目标周围的区域,这非常简单。此外,我们现在向左打开,并将箭头尖端稍微远离目标:

// 获取我们的目标中心作为相对于覆盖层坐标的全局坐标:
RenderBox renderBox = context.findRenderObject() as RenderBox;
final RenderBox overlay = Overlay.of(context).context.findRenderObject() as RenderBox;
var targetGlobalCenter =
    renderBox.localToGlobal(renderBox.size.center(Offset.zero), ancestor: overlay);

tooltip = SuperTooltip(
  popupDirection: TooltipDirection.left,
  top: 150.0,      
  left: 30.0,
  arrowTipDistance: 10.0,
  showCloseButton: ShowCloseButton.inside,
  closeButtonColor: Colors.black,
  closeButtonSize: 30.0,
  hasShadow: false,
  touchThrougArea: new Rect.fromCircle(center:targetGlobalCenter, radius: 40.0),
  content: new Material(
      child: Padding(
        padding: const EdgeInsets.only(top:20.0),
        child: Text(
          "Lorem ipsum dolor sit amet, consetetursadipscing elitr, "
          "sed diam nonumy eirmod tempor invidunt utlabore et dolore magna aliquyam erat, "
          "sed diam voluptua. At vero eos et accusam etjusto duo dolores et ea rebum. ",
    softWrap: true,
  ),
);

如果你希望工具提示占据垂直方向上的最大可用空间,只需设置 snapsFarAwayVertically: true。另外,我们可以让边框变成绿色并更粗,并且触摸通过区域是一个矩形。

tooltip = SuperTooltip(
   popupDirection: TooltipDirection.left,
   arrowTipDistance: 15.0,
   arrowBaseWidth: 40.0,
   arrowLength: 40.0,
   borderColor: Colors.green,
   borderWidth: 5.0,
   snapsFarAwayVertically: true,
   showCloseButton: ShowCloseButton.inside,
   hasShadow: false,
   touchThrougArea: new Rect.fromLTWH(targetGlobalCenter.dx-100,targetGlobalCenter.dy-100, 200.0, 160.0),
   touchThroughAreaShape: ClipAreaShape.rectangle,
   content: new Material(
       child: Padding(
         padding: const EdgeInsets.only(top:20.0),
         child: Text(
           "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, "
           "sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyamerat, "
           "sed diam voluptua. At vero eos et accusam et justo duo dolores et earebum. ",
     softWrap: true,
   ),

完整示例Demo

以下是一个完整的示例,展示了如何使用 super_tooltip_ext 插件创建和显示工具提示。

import 'package:flutter/material.dart';
import 'package:super_tooltip/super_tooltip.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // 这个小部件是你的应用的根
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  SuperTooltip? tooltip;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Center(
          child: ElevatedButton(
            onPressed: () {
              if (tooltip == null) {
                tooltip = SuperTooltip(
                  popupDirection: TooltipDirection.down,
                  content: Material(
                    child: Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: Text(
                        "这是一个工具提示",
                        softWrap: true,
                      ),
                    ),
                  ),
                );
              }
              tooltip?.show(context);
            },
            child: Text('显示工具提示'),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter高级提示框插件super_tooltip_ext的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter高级提示框插件super_tooltip_ext的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用super_tooltip_ext插件的一个简单示例。这个插件提供了高级提示框功能,可以用来显示用户交互时的提示信息。

首先,确保你已经在pubspec.yaml文件中添加了super_tooltip_ext依赖:

dependencies:
  flutter:
    sdk: flutter
  super_tooltip_ext: ^最新版本号  # 请替换为实际最新版本号

然后运行flutter pub get来安装依赖。

接下来是一个完整的示例代码,展示了如何使用super_tooltip_ext插件:

import 'package:flutter/material.dart';
import 'package:super_tooltip_ext/super_tooltip_ext.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Super Tooltip Ext Demo'),
        ),
        body: Center(
          child: TooltipExample(),
        ),
      ),
    );
  }
}

class TooltipExample extends StatefulWidget {
  @override
  _TooltipExampleState createState() => _TooltipExampleState();
}

class _TooltipExampleState extends State<TooltipExample> {
  final GlobalKey<SuperTooltipState> tooltipKey = GlobalKey();

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        ElevatedButton(
          onPressed: () {
            tooltipKey.currentState?.showTooltip(
              context,
              TooltipMessage(
                message: '这是一个高级提示框',
                backgroundColor: Colors.blue.withOpacity(0.9),
                textColor: Colors.white,
                borderRadius: BorderRadius.circular(10),
                arrowColor: Colors.blue,
                padding: EdgeInsets.all(10),
                arrowSize: 10,
                maxWidth: 200,
                showArrow: true,
                arrowPosition: ArrowPosition.top,
                duration: Duration(seconds: 2),
              ),
              position: Offset(0, -50), // 相对于按钮的位置
            );
          },
          child: Text('显示提示框'),
        ),
        SizedBox(height: 20),
        SuperTooltip(
          key: tooltipKey,
          child: ElevatedButton(
            onPressed: () {},
            child: Text('带内置提示框的按钮'),
          ),
          tooltipMessage: TooltipMessage(
            message: '这是一个内置提示框',
            backgroundColor: Colors.green.withOpacity(0.9),
            textColor: Colors.white,
            borderRadius: BorderRadius.circular(10),
            arrowColor: Colors.green,
            padding: EdgeInsets.all(10),
            arrowSize: 10,
            maxWidth: 200,
            showArrow: true,
            arrowPosition: ArrowPosition.top,
            duration: Duration(seconds: 2),
          ),
        ),
      ],
    );
  }
}

在这个示例中,我们创建了两个按钮:

  1. 第一个按钮通过调用tooltipKey.currentState?.showTooltip方法来手动显示提示框。
  2. 第二个按钮使用了SuperTooltip组件,该组件内置了提示框功能,当按钮被长按或触发时会自动显示提示框。

TooltipMessage类允许你自定义提示框的样式和内容,包括背景颜色、文本颜色、边框半径、箭头颜色、内边距、箭头大小、最大宽度、是否显示箭头、箭头位置以及显示持续时间等。

请注意,这个插件的具体使用方法和API可能会随着版本的更新而变化,请参考官方文档和最新版本的使用说明。

回到顶部