Flutter可拖拽交互插件snappable_thanos的使用

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

Flutter可拖拽交互插件snappable_thanos的使用

snappable_thanos 是一个在Flutter中实现类似于“灭霸之响指”效果的库。通过这个库,你可以创建可以被“响指”(即消失或复原)的UI组件。

示例动画

以下是一些示例动画,展示了如何使用 snappable_thanos 实现不同的效果:

Example 1 Example 2 Example 3

使用步骤

导入库

首先需要在你的Dart文件中导入 snappable_thanos 库:

import 'package:snappable_thanos/snappable_thanos.dart';

包装任意Widget

你可以将任何Widget包装在 Snappable 中,以启用该效果:

@override
Widget build(BuildContext context) {
  return Snappable(
    child: Text('This will be snapped'),
  );
}

使用Key进行控制

如果你希望手动控制“响指”效果,可以使用 GlobalKey<SnappableState>

class MyWidget extends StatelessWidget {
  final key = GlobalKey<SnappableState>();

  @override
  Widget build(BuildContext context) {
    return Snappable(
      key: key,
      child: Text('This will be snapped'),
    );
  }

  void snap() {
    key.currentState.snap();
  }
}

撤销效果可以通过调用 currentState.reset() 来实现。

或者通过点击触发

你也可以通过设置 snapOnTap 属性来让Widget在点击时自动触发“响指”效果:

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Snappable(
      snapOnTap: true,
      child: Text('This will be snapped'),
    );
  }
}

再次点击即可撤销效果。

回调函数

当“响指”效果结束时,你可以提供一个回调函数:

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Snappable(
      onSnapped: () => print("Snapped!"),
      child: Text('This will be snapped'),
    );
  }
}

完整示例代码

以下是一个完整的示例代码,展示如何在一个应用中使用 snappable_thanos

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

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

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

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final GlobalKey<SnappableState> _snappableKey = GlobalKey<SnappableState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Snap'),
      ),
      body: Column(
        children: <Widget>[
          Snappable(
            key: _snappableKey,
            snapOnTap: true,
            onSnapped: () => print("Snapped!"),
            child: Card(
              child: Container(
                height: 300,
                width: double.infinity,
                color: Colors.deepPurple,
                alignment: Alignment.center,
                child: Text(
                  'This will be snapped',
                  style: Theme.of(context).textTheme.bodyMedium!.copyWith(
                        color: Colors.white,
                      ),
                ),
              ),
            ),
          ),
          ElevatedButton(
            child: const Text('Snap / Reverse'),
            onPressed: () {
              SnappableState state = _snappableKey.currentState!;
              if (state.isInProgress) {
                // do nothing
                debugPrint("Animation is in progress, please wait!");
              } else if (state.isGone) {
                state.reset();
              } else {
                state.snap();
              }
            },
          )
        ],
      ),
    );
  }
}

以上就是 snappable_thanos 插件的基本使用方法和完整示例代码。通过这些步骤,你可以轻松地在你的Flutter应用中实现类似“灭霸之响指”的炫酷效果。


更多关于Flutter可拖拽交互插件snappable_thanos的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter可拖拽交互插件snappable_thanos的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter应用中使用snappable_thanos插件来实现可拖拽交互的代码案例。snappable_thanos插件允许你创建可拖拽和吸附的卡片或小部件,这在构建如待办事项列表、卡片堆叠界面等场景时非常有用。

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

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

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

接下来是一个简单的示例代码,展示如何使用snappable_thanos来创建一个可拖拽和吸附的卡片列表:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Snappable Thanos Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Snappable Thanos Demo'),
        ),
        body: SnappableThanos(
          itemCount: 10,
          itemBuilder: (BuildContext context, int index) {
            return Card(
              elevation: 4.0,
              child: Container(
                height: 100,
                alignment: Alignment.center,
                child: Text(
                  'Item $index',
                  style: TextStyle(fontSize: 24),
                ),
              ),
            );
          },
          onDragCompleted: (int index, Offset offset, DragEndDetails details) {
            print('Item $index dragged to: $offset');
          },
          onSnap: (int index, int snapToIndex) {
            print('Item $index snapped to $snapToIndex');
          },
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们创建了一个基本的Flutter应用,并在home属性中使用了SnappableThanos小部件。
  2. itemCount属性指定了要创建的卡片数量。
  3. itemBuilder是一个回调,用于构建每个卡片的小部件。在这个例子中,我们简单地使用了Card小部件,并在卡片上显示了卡片的索引。
  4. onDragCompleted是一个可选回调,当拖拽完成时会被调用,它接收被拖拽卡片的索引、最终偏移量和拖拽结束的细节。
  5. onSnap是一个可选回调,当卡片吸附到另一个位置时被调用,它接收被拖拽卡片的索引和吸附到的目标索引。

这个示例提供了一个基本的框架,你可以根据需要进一步自定义卡片的样式、行为以及交互逻辑。snappable_thanos插件提供了丰富的配置选项,允许你实现各种复杂的拖拽和吸附效果。

请注意,由于插件版本可能会更新,建议查看最新的插件文档以获取最新的使用方法和API参考。

回到顶部