Flutter点击悬停切换功能插件tap_hover_toggle的使用

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

Flutter点击悬停切换功能插件tap_hover_toggle的使用

一个Flutter插件,用于处理点击和悬停交互。此小部件允许您轻松检测其子部件上的点击和悬停事件,使其成为您的Flutter应用UI工具箱中的宝贵补充。

移动端 | 网页端

移动端 网页端
demo demo

特性

  • 轻松将点击和悬停功能集成到您的Flutter应用中。
  • 根据需要自定义小部件的外观和行为。
  • 当小部件处于点击或悬停状态时,可以切换布尔状态。

安装

要在您的Flutter项目中使用此小部件,请将其添加到pubspec.yaml文件中:

dependencies:
  flutter:
    sdk: flutter
  tap_hover_toggle: ^0.0.1 # 使用pub.dev上的最新版本

然后运行flutter pub get以安装该包。

使用方法

在您的Dart代码中导入该包:

import 'package:tap_hover_toggle/tap_hover_toggle.dart';

现在,您可以使用TapHoverToggle小部件。以下是如何设置它的示例:

TapHoverToggle(
  builder: (isHoverOrTap){
    return YourContentWidget(); // 返回您想要显示的小部件
  },
  onClick: (){},
)

示例

Example demo
TapHoverToggle(
  builder: (isHoverOrTap){
    return Container(
      decoration: BoxDecoration(
          shape: BoxShape.circle,
          color: isHoverOrTap ? const Color(0xFF1DA1F2) : Colors.white,
          border: Border.all(
              color: isHoverOrTap ? const Color(0xFF1DA1F2) : Colors.black12,
              width: 1
          )
      ),
      padding: const EdgeInsets.all(12),
      child: Icon(
          FontAwesomeIcons.twitter,
          size: 16,
          color: isHoverOrTap ? Colors.white : Colors.black38
      ),
    );
  },
),
  • builder: 您必须在此处传递您想要显示的小部件,并根据isHoverOrTap状态的变化来定制小部件的外观和行为。
  • onClick: 您可以在此处处理点击事件。

示例代码

以下是完整的示例代码:

import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:tap_hover_toggle/tap_hover_toggle.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // 这个小部件是您的应用程序的根节点。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Tap Hover Toggle Example',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(useMaterial3: true, textTheme: GoogleFonts.latoTextTheme()),
      home: const MyHomePage(title: 'Tap Hover Toggle Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final size = MediaQuery.of(context).size;
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Column(
        children: [
          const SizedBox(height: 30),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              TapHoverToggle(
                builder: (isHoverOrTap) {
                  return Container(
                    decoration: BoxDecoration(
                        shape: BoxShape.circle,
                        color: isHoverOrTap
                            ? const Color(0xFF4267B2)
                            : Colors.white,
                        border: Border.all(
                            color: isHoverOrTap
                                ? const Color(0xFF4267B2)
                                : Colors.black12,
                            width: 1)),
                    padding: const EdgeInsets.all(12),
                    child: Icon(FontAwesomeIcons.facebookF,
                        size: 16,
                        color: isHoverOrTap ? Colors.white : Colors.black38),
                  );
                },
              ),
              const SizedBox(
                width: 12,
              ),
              TapHoverToggle(
                builder: (isHoverOrTap) {
                  return Container(
                    decoration: BoxDecoration(
                        shape: BoxShape.circle,
                        color: isHoverOrTap
                            ? const Color(0xFF1DA1F2)
                            : Colors.white,
                        border: Border.all(
                            color: isHoverOrTap
                                ? const Color(0xFF1DA1F2)
                                : Colors.black12,
                            width: 1)),
                    padding: const EdgeInsets.all(12),
                    child: Icon(FontAwesomeIcons.twitter,
                        size: 16,
                        color: isHoverOrTap ? Colors.white : Colors.black38),
                  );
                },
              ),
              const SizedBox(
                width: 12,
              ),
              TapHoverToggle(
                builder: (isHoverOrTap) {
                  return Container(
                    decoration: BoxDecoration(
                        shape: BoxShape.circle,
                        color: isHoverOrTap
                            ? const Color(0xFF25D366)
                            : Colors.white,
                        border: Border.all(
                            color: isHoverOrTap
                                ? const Color(0xFF25D366)
                                : Colors.black12,
                            width: 1)),
                    padding: const EdgeInsets.all(12),
                    child: Icon(FontAwesomeIcons.whatsapp,
                        size: 16,
                        color: isHoverOrTap ? Colors.white : Colors.black38),
                  );
                },
              ),
              const SizedBox(
                width: 12,
              ),
              TapHoverToggle(
                builder: (isHoverOrTap) {
                  return Container(
                    decoration: BoxDecoration(
                        shape: BoxShape.circle,
                        color: isHoverOrTap
                            ? const Color(0xFFE60023)
                            : Colors.white,
                        border: Border.all(
                            color: isHoverOrTap
                                ? const Color(0xFFE60023)
                                : Colors.black12,
                            width: 1)),
                    padding: const EdgeInsets.all(12),
                    child: Icon(FontAwesomeIcons.pinterest,
                        size: 16,
                        color: isHoverOrTap ? Colors.white : Colors.black38),
                  );
                },
              ),
            ],
          ),
          const SizedBox(height: 30),
          SizedBox(
            width: size.width * 0.8,
            child: TapHoverToggle(
              builder: (isHoverOrTap) {
                return Container(
                    decoration: BoxDecoration(
                        borderRadius:
                            const BorderRadius.all(Radius.circular(8)),
                        color: isHoverOrTap ? null : Colors.blueAccent,
                        border:
                            Border.all(color: Colors.blueAccent, width: 1.5)),
                    padding: const EdgeInsets.symmetric(vertical: 12),
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: [
                        Text("Tap to Continue",
                            textAlign: TextAlign.center,
                            style: Theme.of(context)
                                .textTheme
                                .titleMedium!
                                .copyWith(
                                    letterSpacing: 0.6,
                                    fontWeight: FontWeight.w700,
                                    color: isHoverOrTap
                                        ? Colors.blueAccent
                                        : Colors.white,
                                    height: 1.4)),
                      ],
                    ));
              },
            ),
          ),
          const SizedBox(height: 24),
          SizedBox(
            width: size.width * 0.8,
            child: TapHoverToggle(
              builder: (isHoverOrTap) {
                return Image(
                  image: AssetImage(isHoverOrTap
                      ? 'assets/images/bulb_on.JPEG'
                      : 'assets/images/bulb_off.JPEG'),
                  height: size.height * 0.3,
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

更多关于Flutter点击悬停切换功能插件tap_hover_toggle的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter点击悬停切换功能插件tap_hover_toggle的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 tap_hover_toggle Flutter 插件的示例代码。这个插件允许你在点击和悬停之间切换功能,非常适合需要这种交互的应用场景。

首先,你需要在你的 pubspec.yaml 文件中添加这个插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  tap_hover_toggle: ^latest_version  # 请确保使用最新版本号

然后运行 flutter pub get 来获取依赖。

接下来是一个简单的示例代码,展示了如何使用 tap_hover_toggle 插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Tap Hover Toggle Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool isHovered = false;
  bool isTapped = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Tap Hover Toggle Demo'),
      ),
      body: Center(
        child: TapHoverToggle(
          onTap: () {
            setState(() {
              isTapped = !isTapped;
            });
            print('Tapped: $isTapped');
          },
          onHover: (bool hovering) {
            setState(() {
              isHovered = hovering;
            });
            print('Hovering: $isHovered');
          },
          child: Container(
            width: 200,
            height: 200,
            decoration: BoxDecoration(
              color: isTapped ? Colors.green : isHovered ? Colors.lightBlueAccent : Colors.grey,
              borderRadius: BorderRadius.circular(15),
            ),
            child: Center(
              child: Text(
                isTapped ? 'Tapped' : isHovered ? 'Hovering' : 'Idle',
                style: TextStyle(color: Colors.white, fontSize: 24),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

代码解释:

  1. 依赖引入:在 pubspec.yaml 文件中引入 tap_hover_toggle 插件。
  2. 主应用:创建 MyAppMyHomePage 小部件。
  3. 状态管理:在 _MyHomePageState 类中管理两个布尔状态变量 isHoveredisTapped
  4. TapHoverToggle 小部件
    • onTap 回调在点击时触发,切换 isTapped 状态。
    • onHover 回调在悬停状态改变时触发,更新 isHovered 状态。
    • 子小部件(一个容器)根据当前状态改变颜色和显示文本。

这个示例展示了如何使用 tap_hover_toggle 插件来处理点击和悬停事件,并根据这些事件更新界面。你可以根据实际需求进一步自定义和扩展这个示例。

回到顶部