Flutter增强点击区域检测插件expand_hit_test的使用

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

Flutter增强点击区域检测插件 expand_hit_test 的使用

expand_hit_test 是一个用于扩展Flutter中点击区域检测的插件。它提供了几种默认的小部件,并且可以轻松定制。

使用方法

1. 基于 InkWell 扩展点击区域

ExpandInkWell(
    expandArea: const EdgeInsets.all(30),
    onTap: () {
        debugPrint("expand inkwell tap");
    },
    child: Container(color: Colors.red, height: 100, width: 100)
)

2. 基于 GestureDetector 扩展点击区域

ExpandGestureDetector(
    expandArea: const EdgeInsets.all(30),
    onTap: () {
        debugPrint("expand GestureDetector tap");
    },
    child: Container(color: Colors.red, height: 100, width: 100)
)

3. 自定义组件

ExpandHitTestWidget(
    expandArea: const EdgeInsets.all(30),
    child: CupertinoButton(
        padding: EdgeInsets.zero,
        child: Container(color: Colors.red, height: 100, width: 100), 
        onPressed: () {
            debugPrint("expand CupertinoButton tap");
        }
    )
)

4. 超出父级容器的点击区域

如果你需要超出父级容器的点击区域,可以使用 ExpandHitTestScope

ExpandHitTestScope(child: xxxx)

示例 Demo

以下是一个完整的示例项目,展示了如何在应用中集成和使用 expand_hit_test 插件。

import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:expand_hit_test/expand_hit_test.dart';

void main() {
  // 显示调试区域
  ExpandHitTestConfigs.showDebugArea = true;
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const HomePage(),
    );
  }
}

class HomePage extends StatelessWidget {
  const HomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("Expand hit test example")),
      body: Column(
        children: [
          CupertinoButton(
            child: const Text("Example 1"),
            onPressed: () {
              Navigator.of(context).push(MaterialPageRoute(
                builder: (BuildContext context) => const Example1(),
              ));
            },
          ),
          CupertinoButton(
            child: const Text("Example 2"),
            onPressed: () {
              Navigator.of(context).push(MaterialPageRoute(
                builder: (BuildContext context) => const Example2(),
              ));
            },
          ),
          CupertinoButton(
            child: const Text("Example 3"),
            onPressed: () {
              Navigator.of(context).push(MaterialPageRoute(
                builder: (BuildContext context) => const Example3(),
              ));
            },
          ),
          CupertinoButton(
            child: const Text("Example 4"),
            onPressed: () {
              Navigator.of(context).push(MaterialPageRoute(
                builder: (BuildContext context) => const Example4(),
              ));
            },
          ),
        ],
      ),
    );
  }
}

// 示例页面1
class Example1 extends StatelessWidget {
  const Example1({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("Example 1")),
      body: Center(
        child: ExpandInkWell(
          expandArea: const EdgeInsets.all(30),
          onTap: () {
            debugPrint("expand inkwell tap in Example 1");
          },
          child: Container(color: Colors.red, height: 100, width: 100),
        ),
      ),
    );
  }
}

// 示例页面2
class Example2 extends StatelessWidget {
  const Example2({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("Example 2")),
      body: Center(
        child: ExpandGestureDetector(
          expandArea: const EdgeInsets.all(30),
          onTap: () {
            debugPrint("expand GestureDetector tap in Example 2");
          },
          child: Container(color: Colors.green, height: 100, width: 100),
        ),
      ),
    );
  }
}

// 示例页面3
class Example3 extends StatelessWidget {
  const Example3({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("Example 3")),
      body: Center(
        child: ExpandHitTestWidget(
          expandArea: const EdgeInsets.all(30),
          child: CupertinoButton(
            padding: EdgeInsets.zero,
            child: Container(color: Colors.blue, height: 100, width: 100),
            onPressed: () {
              debugPrint("expand CupertinoButton tap in Example 3");
            },
          ),
        ),
      ),
    );
  }
}

// 示例页面4
class Example4 extends StatelessWidget {
  const Example4({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("Example 4")),
      body: Center(
        child: ExpandHitTestScope(
          child: Container(
            color: Colors.yellow,
            height: 100,
            width: 100,
            child: GestureDetector(
              onTap: () {
                debugPrint("tap within expanded area in Example 4");
              },
            ),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter增强点击区域检测插件expand_hit_test的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter增强点击区域检测插件expand_hit_test的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用expand_hit_test插件来增强点击区域检测的示例代码。首先,你需要确保你的Flutter项目中已经添加了expand_hit_test插件。如果还没有添加,可以在你的pubspec.yaml文件中添加以下依赖:

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

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

接下来,是一个简单的示例,展示如何使用expand_hit_test插件来扩展按钮的点击区域:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Expand Hit Test Example'),
        ),
        body: Center(
          child: ExpandHitTestExample(),
        ),
      ),
    );
  }
}

class ExpandHitTestExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        // 使用 ExpandHitTestWidget 包装一个按钮,并设置扩展的点击区域
        ExpandHitTestWidget(
          hitTestArea: Rect.fromLTWH(0, -50, 200, 100),  // 设置扩展的点击区域
          child: ElevatedButton(
            onPressed: () {
              print('Button pressed!');
            },
            child: Text('Click Me'),
          ),
        ),
        SizedBox(height: 20),
        Text(
          'Try clicking above or below the button within the specified hit test area.',
          style: TextStyle(fontSize: 16),
        ),
      ],
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮。我们使用ExpandHitTestWidget来包装这个按钮,并为其设置了一个扩展的点击区域。Rect.fromLTWH(0, -50, 200, 100)定义了一个矩形区域,这个区域从按钮的顶部向上扩展50个单位,向下保持原样,并且左右各扩展50个单位(因为宽度设置为200,而按钮的宽度通常小于这个值)。

这样,当用户点击这个扩展区域内的任意位置时,按钮的点击事件都会被触发。

请注意,expand_hit_test插件的具体使用方法和API可能会随着版本的更新而变化,因此请参考插件的官方文档和示例代码来获取最新的信息。

回到顶部