Flutter长按手势识别插件holding_gesture的使用

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

Flutter长按手势识别插件holding_gesture的使用

holding_gesture简介

holding_gesture 是一个自定义的手势检测器,它可以在用户长按指定的小部件时触发特定的行为。该插件提供了两个主要的小部件:HoldDetectorHoldTimeoutDetector,用于实现不同的长按交互逻辑。

引入依赖

在使用 holding_gesture 插件之前,你需要先将其添加到你的项目中。打开项目的 pubspec.yaml 文件,在 dependencies 部分添加以下内容:

dependencies:
  holding_gesture: ^最新版本号

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

接下来,在 Dart 文件中导入包:

import 'package:holding_gesture/holding_gesture.dart';

HoldDetector 使用示例

HoldDetector 是一个类似于 Flutter 自带的 GestureDetector 的小部件,但它专门用于处理长按事件。你可以像使用 GestureDetector 一样使用它。需要注意的是,如果子组件中有 onPressed 或类似的回调函数,则 HoldDetectoronTap 回调将不会生效,因此你应该将单击行为传递给子组件。

HoldDetector(
  onHold: _incrementCounter, // 长按时触发的方法
  holdTimeout: Duration(milliseconds: 200), // 触发长按事件的时间间隔
  enableHapticFeedback: true, // 是否启用触觉反馈
  child: ElevatedButton(
    onPressed: _incrementCounter, // 单击时触发的方法
    child: Text("onHold"),
  ),
),

HoldTimeoutDetector 使用示例

HoldTimeoutDetector 提供了更复杂的功能。它可以用于在用户长按一段时间后执行某些操作,或者在长按过程中显示一些提示信息。下面是一个例子,展示了如何使用 HoldTimeoutDetector 来显示加载状态,并在超时后增加计数器。

HoldTimeoutDetector(
  onTimeout: () {
    _incrementCounter();
    _updateLoading(false);
  }, // 当长按超过设定时间后触发的方法
  onTimerInitiated: () => _updateLoading(true), // 当开始计时时触发的方法
  onCancel: () => _updateLoading(false), // 当长按被取消时触发的方法
  holdTimeout: Duration(milliseconds: 3000), // 设置超时时间为3秒
  enableHapticFeedback: true,
  child: ElevatedButton.icon(
    onPressed: () {},
    label: Text("onTimeout"),
    icon: _isLoading
        ? SizedBox(
            width: 16,
            height: 16,
            child: CircularProgressIndicator(
              strokeWidth: 2,
              valueColor: AlwaysStoppedAnimation(Colors.white),
            ),
          )
        : Icon(Icons.timer_3),
  ),
),

完整的示例代码

为了更好地理解 holding_gesture 插件的用法,这里给出一个完整的示例代码。这个例子创建了一个简单的应用程序,其中包含两个按钮,一个用于测试 HoldDetector,另一个用于测试 HoldTimeoutDetector

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  int _counter = 0;
  bool _isLoading = false;

  void _incrementCounter() {
    if (mounted) {
      setState(() {
        _counter += 1;
      });
    }
  }

  void _updateLoading(bool value) {
    if (mounted) {
      setState(() {
        _isLoading = value;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('holding_gesture'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'You have pushed (or held) the button this many times:',
              ),
              Text(
                '$_counter',
                style: Theme.of(context).textTheme.headlineMedium,
              ),
            ],
          ),
        ),
        bottomNavigationBar: _isLoading ? LinearProgressIndicator() : null,
        persistentFooterButtons: [
          HoldDetector(
            onHold: _incrementCounter,
            holdTimeout: Duration(milliseconds: 200),
            enableHapticFeedback: true,
            child: ElevatedButton(
              onPressed: _incrementCounter,
              child: Text("onHold"),
            ),
          ),
          HoldTimeoutDetector(
            onTimeout: () {
              _incrementCounter();
              _updateLoading(false);
            },
            onTimerInitiated: () => _updateLoading(true),
            onCancel: () => _updateLoading(false),
            holdTimeout: Duration(milliseconds: 3000),
            enableHapticFeedback: true,
            child: ElevatedButton.icon(
              onPressed: () {},
              label: Text("onTimeout"),
              icon: _isLoading
                  ? SizedBox(
                      width: 16,
                      height: 16,
                      child: CircularProgressIndicator(
                        strokeWidth: 2,
                        valueColor: AlwaysStoppedAnimation(Colors.white),
                      ),
                    )
                  : Icon(Icons.timer_3),
            ),
          ),
        ],
      ),
    );
  }
}

通过上述代码,您可以体验 holding_gesture 插件提供的两种不同类型的长按手势检测功能。希望这对您有所帮助!


更多关于Flutter长按手势识别插件holding_gesture的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter长按手势识别插件holding_gesture的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用holding_gesture插件来识别长按手势的一个示例。这个插件允许你检测用户何时长时间按住一个组件,并处理相应的回调。

首先,确保你已经将holding_gesture插件添加到你的pubspec.yaml文件中:

dependencies:
  flutter:
    sdk: flutter
  holding_gesture: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来安装插件。

接下来,你可以在你的Flutter应用中使用这个插件。以下是一个简单的示例,展示了如何在一个按钮上应用长按手势识别:

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

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

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

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

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

  void _onHoldingStart(HoldingDetails details) {
    setState(() {
      isHolding = true;
    });
    print("Holding started at: ${details.globalPosition}");
  }

  void _onHoldingEnd(HoldingDetails details) {
    setState(() {
      isHolding = false;
    });
    print("Holding ended at: ${details.globalPosition}");
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Holding Gesture Demo'),
      ),
      body: Center(
        child: HoldingGesture(
          onHoldingStart: _onHoldingStart,
          onHoldingEnd: _onHoldingEnd,
          holdingThreshold: Duration(seconds: 2),  // 设置长按阈值时间,例如2秒
          child: Container(
            width: 200,
            height: 200,
            color: isHolding ? Colors.green : Colors.grey,
            child: Center(
              child: Text(
                isHolding ? 'Holding...' : 'Press and Hold',
                style: TextStyle(color: Colors.white, fontSize: 24),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们创建了一个简单的Flutter应用,包含一个主页MyHomePage
  2. MyHomePage是一个有状态的组件,它包含一个布尔值isHolding来跟踪用户是否正在长按。
  3. 我们使用了HoldingGesture组件,它包装了一个Container
  4. HoldingGesture组件有两个回调方法:onHoldingStartonHoldingEnd,分别处理长按开始和结束的事件。
  5. 当用户开始长按Container时,onHoldingStart回调会被触发,isHolding状态会被设置为true,并且Container的颜色会变成绿色。
  6. 当用户停止长按时,onHoldingEnd回调会被触发,isHolding状态会被设置为false,并且Container的颜色会恢复为灰色。
  7. 你可以通过holdingThreshold属性来设置长按的阈值时间,例如在这个示例中,我们设置为了2秒。

这个示例展示了如何使用holding_gesture插件来识别并处理长按手势。你可以根据自己的需求对代码进行修改和扩展。

回到顶部