Flutter长按按钮功能插件hold_down_button的使用

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

Flutter长按按钮功能插件hold_down_button的使用

插件介绍

hold_down_button 是一个Flutter包,当一个小部件被长按时可以触发重复的动作。它允许用户自定义时间延迟曲线,以更快或更慢的速度触发动作,并设置周期性函数调用的时间延迟。

demo

获取开始

添加到依赖项

pubspec.yaml 文件中添加以下内容:

dependencies:
  hold_down_button: ^1.1.0

导入包

在Dart文件中导入该包:

import 'package:hold_down_button/hold_down_button.dart';

使用方法

使用默认值的小部件

最简单的用法是使用默认参数创建一个 HoldDownButton 小部件:

HoldDownButton(
  onHoldDown: () => print('Pressed'),
  child: ElevatedButton(
    onPressed: () => print('Pressed'),
    child: const Text('ElevatedButton'),
  ),
),

自定义初始延迟曲线

您可以自定义不同的等待时间来改变触发行为:

HoldDownButton(
  onHoldDown: () => print('Pressed'),
  longWait: const Duration(seconds: 1),
  middleWait: const Duration(milliseconds: 750),
  minWait: const Duration(milliseconds: 500),
  child: ElevatedButton(
    onPressed: () => print('Pressed'),
    child: const Text('ElevatedButton'),
  ),
),

改变周期性函数调用的时间延迟

通过设置 holdWait 参数来调整周期性函数调用的时间间隔:

HoldDownButton(
  onHoldDown: () => print('Pressed'),
  holdWait: const Duration(milliseconds: 200),
  child: ElevatedButton(
    onPressed: () => print('Pressed'),
    child: const Text('ElevatedButton'),
  ),
),

完整示例代码

下面是一个完整的示例代码,展示了如何在一个应用程序中使用 hold_down_button 包:

// Flutter Packages
import 'package:flutter/material.dart';

// This Package
import 'package:hold_down_button/hold_down_button.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.purple,
      ),
      darkTheme: ThemeData(
        brightness: Brightness.dark,
        primarySwatch: Colors.purple,
      ),
      themeMode: ThemeMode.dark,
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

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

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
            const Divider(
              thickness: 2,
            ),
            HoldDownButton(
              onHoldDown: _incrementCounter,
              child: const Text('Text'),
            ),
            const Divider(
              thickness: 2,
            ),
            HoldDownButton(
              onHoldDown: _incrementCounter,
              longWait: const Duration(milliseconds: 1000),
              middleWait: const Duration(milliseconds: 600),
              minWait: const Duration(milliseconds: 300),
              child: ElevatedButton(
                onPressed: _incrementCounter,
                child: const Text('ElevatedButton'),
              ),
            ),
            const Divider(
              thickness: 2,
            ),
            HoldDownButton(
              onHoldDown: _incrementCounter,
              longWait: const Duration(milliseconds: 2000),
              middleWait: const Duration(milliseconds: 1500),
              minWait: const Duration(milliseconds: 1200),
              holdWait: const Duration(milliseconds: 1000),
              child: TextButton(
                onPressed: _incrementCounter,
                child: const Text('TextButton'),
              ),
            ),
            const Divider(
              thickness: 2,
            ),
            HoldDownButton(
              onHoldDown: _incrementCounter,
              longWait: const Duration(milliseconds: 100),
              middleWait: const Duration(milliseconds: 100),
              minWait: const Duration(milliseconds: 100),
              holdWait: const Duration(milliseconds: 100),
              child: InkWell(
                onTap: _incrementCounter,
                child: Ink(
                  width: 100,
                  height: 100,
                  color: Colors.red,
                  child: const Center(
                    child: Text('Ink & InkWell'),
                  ),
                ),
              ),
            ),
          ],
        ),
      ),
      floatingActionButton: HoldDownButton(
        onHoldDown: _incrementCounter,
        child: FloatingActionButton(
          onPressed: _incrementCounter,
          child: const Icon(Icons.add),
        ),
      ),
    );
  }
}

以上代码展示了如何在一个Flutter应用中集成并使用 hold_down_button 插件,包括基本用法和一些高级配置选项。希望这能帮助您更好地理解和使用这个插件!如果觉得这个包有用,请记得给它点赞👍🏼和加星⭐哦!


更多关于Flutter长按按钮功能插件hold_down_button的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter长按按钮功能插件hold_down_button的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用hold_down_button插件来实现长按按钮功能的代码示例。

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

dependencies:
  flutter:
    sdk: flutter
  hold_down_button: ^最新版本号  # 请替换为实际可用的最新版本号

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

接下来,在你的Dart文件中使用HoldDownButton组件。以下是一个完整的示例,展示如何实现一个简单的长按按钮功能:

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  bool isButtonPressed = false;
  bool isLongPressed = false;
  Duration pressDuration = Duration.zero;

  void onPressStart() {
    setState(() {
      isButtonPressed = true;
      isLongPressed = false;
      pressDuration = Duration.zero;
    });
  }

  void onPressEnd() {
    setState(() {
      isButtonPressed = false;
      if (pressDuration.inSeconds >= 1) { // 假设长按时间阈值为1秒
        isLongPressed = true;
      } else {
        isLongPressed = false;
      }
      pressDuration = Duration.zero; // 重置按压时长
    });
  }

  void onPressing(Duration duration) {
    setState(() {
      pressDuration = duration;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Long Press Button Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            HoldDownButton(
              onPressStart: onPressStart,
              onPressEnd: onPressEnd,
              onPressing: onPressing,
              child: Container(
                width: 100,
                height: 50,
                decoration: BoxDecoration(
                  color: isButtonPressed ? Colors.green : Colors.blue,
                  borderRadius: BorderRadius.circular(10),
                ),
                child: Center(
                  child: Text(
                    isLongPressed ? 'Long Pressed' : 'Press & Hold',
                    style: TextStyle(color: Colors.white),
                  ),
                ),
              ),
            ),
            SizedBox(height: 20),
            Text(
              'Press duration: ${pressDuration.inMilliseconds}ms',
              style: TextStyle(fontSize: 16),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们定义了一个_MyHomePageState类,其中包含了按钮的按压状态(isButtonPressedisLongPressed)以及按压的持续时间(pressDuration)。
  2. HoldDownButton组件有三个回调函数:onPressStartonPressEndonPressing
    • onPressStart:按钮开始被按下时调用。
    • onPressEnd:按钮释放时调用,根据按压时间判断是否为长按。
    • onPressing:按钮持续被按下时调用,用于更新按压时间。
  3. 按钮的颜色根据是否被按下而改变,同时文本显示当前的状态(是否长按)。
  4. 底部显示按压的持续时间。

这样,你就可以在Flutter应用中使用hold_down_button插件来实现长按按钮的功能了。

回到顶部