Flutter可点击组件插件clickable_widget的使用

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

Flutter可点击组件插件clickable_widget的使用

该Flutter插件提供了一些具有手势处理功能的Flutter小部件。默认情况下,一些Flutter小部件(无手势处理的小部件)不会触发手势事件,因此我们将其包裹在InkWell或GestureDetector中。为了解决这个问题,我决定构建一个包,让开发者可以直接在无手势处理的小部件中添加手势处理。

可用的手势处理器

  • onTap
  • onTapDown
  • onTapUp
  • onTapCancel
  • onDoubleTapDown
  • onDoubleTap
  • onDoubleTapCancel
  • onLongPressDown
  • onLongPressCancel
  • onLongPress
  • onLongPressStart
  • onLongPressMoveUpdate
  • onLongPressUp
  • onLongPressEnd

可用的小部件

  1. ClickableContainer
  2. ClickableImage
  3. ClickableCard
  4. ClickableGridTile
  5. ClickableSizedBox
  6. ClickableText
  7. ClickableRow
  8. ClickableColumn

使用方法

将Clickabe Widget添加到你的pubspec.yaml文件中的dependencies部分:

dependencies:
  clickable_widget: ^latest

更新依赖项:

flutter pub get

导入并使用Clickable Container小部件:

ClickableContainer(
  onTap: () {
    debugPrint("container tapped");
  },
  alignment: Alignment.center,
  width: 100.0,
  height: 100.0,
  color: Colors.grey,
  child: const Text("Tap me!"),
),

导入并使用Clickable Image小部件:

ClickableImage(
  onTap: () {
    debugPrint("network image tapped");
  },
  clickableImageType: ClickableImageType.network,
  src: "https://pixabay.com/fr/images/search/nature/",
),

导入并使用Clickable GridTile小部件:

ClickableGridTile(
  onTap: () {
    debugPrint("grid tile tapped");
  },
  child: const Text("Tap me!"),
),

示例代码

以下是一个完整的示例代码,展示了如何使用这些可点击的小部件:

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Clickable widget Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(title: const Text("Clickable widget Example")),
        body: SingleChildScrollView(
          padding: const EdgeInsets.all(16),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              const Text("ClickableContainer 👇"),
              // ClickableContainer
              ClickableContainer(
                onTap: () {
                  debugPrint("container tapped");
                },
                alignment: Alignment.center,
                width: 100.0,
                height: 100.0,
                margin: const EdgeInsets.all(8),
                decoration: BoxDecoration(
                  color: Colors.red,
                  borderRadius: BorderRadius.circular(16),
                ),
                child: const Text(
                  "I'm a container. Tap me!",
                  style: TextStyle(color: Colors.white),
                  textAlign: TextAlign.center,
                ),
              ),
              const Text("ClickableImage 👇"),
              // ClickableImage
              ClickableImage(
                onTap: () {
                  debugPrint("image tapped");
                },
                clickableImageType: ClickableImageType.network,
                src: "https://picsum.photos/150/150",
              ),
              const SizedBox(height: 16),
              const Text("ClickableCard 👇"),
              // ClickableCard
              ClickableCard(
                onDoubleTap: () {
                  debugPrint("You have double tapped the card");
                },
                child: const Padding(
                  padding: EdgeInsets.all(8.0),
                  child: Text("I'm a clickable card. Double Tap me!"),
                ),
              ),
              const SizedBox(height: 16),
              const Text("ClickableGridTile 👇"),
              SizedBox(
                height: 100,
                width: 200,
                // ClickableGridTile
                child: ClickableGridTile(
                  onTap: () {
                    debugPrint("GridTile tapped!");
                  },
                  footer: const GridTileBar(
                    title: Text("I'm a clickable grid tile. Tap me!"),
                    backgroundColor: Colors.black38,
                  ),
                  child: Image.network(
                    "https://picsum.photos/100/100",
                    fit: BoxFit.cover,
                  ),
                ),
              ),
              const SizedBox(height: 16),
              const Text("ClickableRow 👇"),
              ClickableRow(
                onTap: () {},
                children: const <Widget>[
                  Text("View more"),
                  Icon(Icons.chevron_right)
                ],
              ),
              const SizedBox(height: 16),
              const Text("ClickableColumn 👇"),
              ClickableColumn(
                onTap: () {},
                children: const <Widget>[
                  Icon(Icons.local_airport),
                  Text("Travel"),
                ],
              ),
              const SizedBox(height: 12),
              // Useful case of ClickableText
              const Text("Useful case of ClickableText 👇"),
              Wrap(
                alignment: WrapAlignment.start,
                crossAxisAlignment: WrapCrossAlignment.center,
                runAlignment: WrapAlignment.start,
                spacing: 4,
                runSpacing: 4,
                children: [
                  const Text(
                    "By signing up, you agree to the",
                  ),
                  ClickableText(
                    "Terms of Service",
                    style: const TextStyle(color: Colors.blue),
                    onTap: () {
                      /* your code here */
                    },
                  ),
                  const Text("and"),
                  ClickableText(
                    "Privacy Policy",
                    style: const TextStyle(color: Colors.blue),
                    onTap: () {
                      /* your code here */
                    },
                  )
                ],
              )
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter可点击组件插件clickable_widget的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter可点击组件插件clickable_widget的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用clickable_widget插件的示例代码。需要注意的是,由于clickable_widget并不是一个广泛认可的Flutter官方插件或常见第三方库,我将假设你指的是一个自定义的可点击组件,或者一个类似的插件,它允许你创建一个可点击的widget。

在Flutter中,创建一个可点击的widget通常使用GestureDetector,它可以检测各种手势(如点击、双击、长按等)。如果你确实有一个名为clickable_widget的自定义插件或库,并且它的功能与GestureDetector类似,你可以按照以下模式使用它(以下示例将使用GestureDetector作为替代,因为clickable_widget不是一个标准的Flutter组件)。

使用GestureDetector创建可点击组件

首先,确保你的Flutter环境已经设置好,并且你已经创建了一个Flutter项目。

然后,在你的dart文件中,你可以这样使用GestureDetector

import 'package:flutter/material.dart';

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

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Clickable Widget Demo'),
      ),
      body: Center(
        child: GestureDetector(
          onTap: () {
            // 在这里处理点击事件
            print('Widget clicked!');
            // 例如,你可以导航到另一个页面
            // Navigator.push(context, MaterialPageRoute(builder: (context) => SecondPage()));
          },
          child: Container(
            width: 200,
            height: 100,
            color: Colors.blue,
            child: Center(
              child: Text(
                'Click Me',
                style: TextStyle(color: Colors.white),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

假设存在一个clickable_widget插件

如果你确实有一个名为clickable_widget的插件,并且它的使用方式与GestureDetector类似,你可以按照以下方式使用(以下代码是假设性的,因为clickable_widget并不是一个真实存在的标准库):

import 'package:flutter/material.dart';
import 'package:clickable_widget/clickable_widget.dart'; // 假设的导入路径

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

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Clickable Widget Demo'),
      ),
      body: Center(
        child: ClickableWidget( // 假设的组件
          onClicked: () {
            // 在这里处理点击事件
            print('clickable_widget clicked!');
          },
          child: Container(
            width: 200,
            height: 100,
            color: Colors.blue,
            child: Center(
              child: Text(
                'Click Me',
                style: TextStyle(color: Colors.white),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

请注意,由于clickable_widget不是标准的Flutter库,上述代码中的ClickableWidget和它的onClicked属性是假设的。如果你确实有一个名为clickable_widget的插件,你需要查阅该插件的文档来了解其正确的使用方法和属性。

回到顶部