Flutter对齐提示插件aligned_tooltip的使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter对齐提示插件aligned_tooltip的使用

aligned_tooltip 是一个Flutter插件,提供了比标准 Tooltip 更灵活的提示功能。它允许你设置任意内容,并且可以适应垂直和水平布局。以下是关于如何使用该插件的详细介绍。

快速开始

要使用 aligned_tooltip 插件,你需要在你的项目中添加依赖项。在 pubspec.yaml 文件中添加以下代码:

dependencies:
  aligned_tooltip: ^latest_version # 替换为最新版本号

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

基本用法

AlignedTooltip 需要两个参数:直接子组件(child)和提示内容(content)。下面是一个简单的例子:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Aligned Tooltip Example')),
        body: Center(
          child: AlignedTooltip(
            child: Material(
              color: Colors.grey.shade800,
              shape: const CircleBorder(),
              elevation: 4.0,
              child: const Padding(
                padding: EdgeInsets.all(8.0),
                child: Icon(Icons.add, color: Colors.white),
              ),
            ),
            content: const Padding(
              padding: EdgeInsets.all(8.0),
              child: Text(
                '这是一个示例提示文本。',
              ),
            ),
          ),
        ),
      ),
    );
  }
}

使用控制器管理状态

如果你想更精确地控制提示框的状态,你可以创建一个 AlignedController 实例并将其传递给构造函数:

final tooltipController = AlignedController();

@override
void initState() {
  super.initState();
  // 程序化显示提示框,延迟2秒后显示
  Future.delayed(const Duration(seconds: 2), () {
    tooltipController.showTooltip(immediately: false);
  });

  tooltipController.addListener(() {
    // 打印提示框的状态
    print('controller: ${tooltipController.value}');
  });
}

@override
Widget build(BuildContext context) {
  return AlignedTooltip(
    controller: tooltipController,
    child: Material(
      color: Colors.grey.shade800,
      shape: const CircleBorder(),
      elevation: 4.0,
      child: const Padding(
        padding: EdgeInsets.all(8.0),
        child: Icon(Icons.add, color: Colors.white),
      ),
    ),
    content: const Padding(
      padding: EdgeInsets.all(8.0),
      child: Text(
        '这是一个由控制器管理的提示文本。',
      ),
    ),
  );
}

自定义提示框行为

模态提示框

你可以通过设置 isModal 属性来定义提示框的行为。模态提示框仅通过点击子组件打开,并通过点击背景区域关闭。非模态提示框则会在悬停时自动显示和隐藏。

AlignedTooltip(
  isModal: true,
  child: ...,
  content: ...,
)

自定义尾部

如果你想要自定义提示框的尾部(即对话框气泡上的小箭头),你可以传递自己的 tailBuilder 函数:

Path customTailBuilder(Offset tip, Offset point2, Offset point3) {
  return Path()
    ..moveTo(tip.dx, tip.dy)
    ..lineTo(point2.dx, point2.dy)
    ..lineTo(point3.dx, point3.dy)
    ..close();
}

AlignedTooltip(
  tailBuilder: customTailBuilder,
  child: ...,
  content: ...,
)

在列表视图中使用

提示框可以在列表中跟随目标滚动。为了更好地考虑可用空间,你可以传递一个 ScrollControllerjust_the_tooltip

ListView.builder(
  controller: scrollController,
  itemCount: 30,
  itemBuilder: (context, index) {
    if (index == 15) {
      return AlignedTooltipEntry(
        scrollController: scrollController,
        child: ...,
        content: ...,
      );
    }
    return ListTile(title: Text('Item $index'));
  },
)

非覆盖式提示框

对于需要作为 widget 树一部分而不是覆盖层的提示框,你可以使用 AlignedTooltipEntry

Scaffold(
  appBar: AppBar(title: Text('It goes under me')),
  body: AlignedTooltipArea(
    builder: (context, tooltip, scrim) {
      return Stack(
        fit: StackFit.passthrough,
        children: [
          ListView.builder(
            itemCount: 30,
            itemBuilder: (context, index) {
              if (index == 15) {
                return AlignedTooltipEntry(
                  tailLength: 10.0,
                  preferredDirection: AxisDirection.down,
                  isModal: true,
                  margin: EdgeInsets.all(20.0),
                  child: Material(
                    color: Colors.blue,
                    shape: CircleBorder(),
                    elevation: 4.0,
                    child: Padding(
                      padding: EdgeInsets.all(8.0),
                      child: Icon(Icons.touch_app, color: Colors.white),
                    ),
                  ),
                  content: Column(
                    mainAxisSize: MainAxisSize.min,
                    children: [
                      Container(
                        height: 120,
                        color: Colors.blue,
                        width: double.infinity,
                      ),
                      SizedBox(height: 8),
                      Text(
                        'Quia ducimus eius magni voluptatibus ut veniam ducimus. Ullam ab qui voluptatibus quos est in. Maiores eos ab magni tempora praesentium libero. Voluptate architecto rerum vel sapiente ducimus aut cumque quibusdam. Consequatur illo et quos vel cupiditate quis dolores at.',
                      ),
                    ],
                  ),
                );
              }
              return ListTile(title: Text('Item $index'));
            },
          ),
          scrim,
          tooltip,
        ],
      );
    },
  ),
);

通过以上介绍,你应该能够很好地理解和使用 aligned_tooltip 插件了。如果有任何问题或建议,欢迎提交 issue 或者 PR。


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

1 回复

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


当然,以下是如何在Flutter中使用aligned_tooltip插件的一个示例。aligned_tooltip插件允许你显示一个对齐的提示框,这在需要向用户展示额外信息时非常有用。

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

dependencies:
  flutter:
    sdk: flutter
  aligned_tooltip: ^2.0.0  # 请检查最新版本号

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

接下来是一个完整的示例代码,展示如何使用aligned_tooltip

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Aligned Tooltip Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Aligned Tooltip Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              SizedBox(
                width: 100,
                height: 100,
                child: AlignedTooltip(
                  alignment: Alignment.topRight,
                  width: 200,
                  margin: EdgeInsets.only(top: 10, right: 10),
                  child: ElevatedButton(
                    onPressed: () {},
                    child: Text('Hover me'),
                  ),
                  tooltip: Container(
                    decoration: BoxDecoration(
                      color: Colors.black.withOpacity(0.8),
                      borderRadius: BorderRadius.circular(8),
                    ),
                    padding: EdgeInsets.all(8),
                    child: Text(
                      'This is an aligned tooltip!',
                      style: TextStyle(color: Colors.white),
                    ),
                  ),
                ),
              ),
              SizedBox(height: 20),
              SizedBox(
                width: 100,
                height: 100,
                child: AlignedTooltip(
                  alignment: Alignment.bottomLeft,
                  width: 200,
                  margin: EdgeInsets.only(bottom: 10, left: 10),
                  child: ElevatedButton(
                    onPressed: () {},
                    child: Text('Hover me too'),
                  ),
                  tooltip: Container(
                    decoration: BoxDecoration(
                      color: Colors.black.withOpacity(0.8),
                      borderRadius: BorderRadius.circular(8),
                    ),
                    padding: EdgeInsets.all(8),
                    child: Text(
                      'Another aligned tooltip!',
                      style: TextStyle(color: Colors.white),
                    ),
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了两个按钮,每个按钮都有一个与之关联的AlignedTooltipAlignedTooltip有几个关键参数:

  • alignment:定义提示框相对于子组件的位置。例如,Alignment.topRight 将提示框放置在子组件的右上角。
  • width:定义提示框的宽度。
  • margin:定义提示框与父组件之间的边距。
  • child:需要显示提示框的子组件,例如按钮。
  • tooltip:实际的提示框内容,可以是任何Widget

当你运行这个应用并悬停在按钮上时,你会看到相应的提示框出现在指定位置。

希望这个示例能帮你更好地理解如何在Flutter中使用aligned_tooltip插件!

回到顶部