Flutter可拖拽分割插件snappable的使用

Flutter可拖拽分割插件snappable的使用

snappable 是一个在 Flutter 中实现类似灭霸效果的库。你可以通过它轻松实现可拖拽分割的功能。更多关于该插件的信息可以查看 Fidev 博客文章

示例效果

以下是 snappable 的一些示例效果:

使用步骤

1. 导入插件

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

dependencies:
  snappable: ^x.x.x

然后运行以下命令以安装依赖:

flutter pub get

接下来,在你的 Dart 文件中导入插件:

import 'package:snappable/snappable.dart';

2. 包裹任意 Widget

使用 Snappable 将任何 Widget 包裹起来,使其具有可拖拽分割的功能。

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

3. 使用 Key 控制拖拽

你还可以通过 GlobalKey 来手动控制拖拽和重置。

示例代码

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

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

  // 手动触发拖拽
  void snap() {
    key.currentState.snap();
  }

  // 手动重置
  void reset() {
    key.currentState.reset();
  }
}

4. 点击触发拖拽

如果你希望点击 Widget 即可触发拖拽,可以设置 snapOnTap 属性为 true

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

点击一次触发拖拽,再次点击则重置。

完整示例代码

以下是一个完整的示例代码,展示了如何使用 snappable 插件。

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

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

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

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Snap Example'),
      ),
      body: Column(
        children: <Widget>[
          // 使用 Snappable 包裹的 Widget
          Snappable(
            key: _snappableKey,
            snapOnTap: true, // 点击即可触发拖拽
            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.title.copyWith(
                        color: Colors.white,
                      ),
                ),
              ),
            ),
          ),
          // 按钮用于手动触发拖拽或重置
          RaisedButton(
            child: Text('Snap / Reverse'),
            onPressed: () {
              SnappableState state = _snappableKey.currentState;
              if (state.isGone) {
                state.reset(); // 如果已经拖拽出去,则重置
              } else {
                state.snap(); // 否则触发拖拽
              }
            },
          )
        ],
      ),
    );
  }
}

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

1 回复

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


snappable 是一个用于 Flutter 的插件,它允许你将一个部件(Widget)设置为可拖拽的,并且可以将其“吸附”到特定的位置或边界。这个插件非常适合用于创建可拖拽的 UI 元素,例如可拖拽的面板、卡片、或者其他可移动的部件。

安装 snappable 插件

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

dependencies:
  flutter:
    sdk: flutter
  snappable: ^1.0.0  # 请检查最新版本

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

使用 snappable 插件

以下是一个简单的示例,展示了如何使用 snappable 插件来创建一个可拖拽的部件。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Snappable Example'),
        ),
        body: Center(
          child: Snappable(
            snapOnTap: true,
            onSnapped: (snapped) {
              print('Snapped: $snapped');
            },
            child: Container(
              width: 200,
              height: 200,
              color: Colors.blue,
              child: Center(
                child: Text(
                  'Drag Me',
                  style: TextStyle(color: Colors.white, fontSize: 20),
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

参数说明

  • snapOnTap: 当设置为 true 时,点击部件会触发吸附效果。
  • onSnapped: 当部件被吸附时触发的回调函数,返回一个布尔值表示是否被吸附。
  • child: 你想要设置为可拖拽的部件。

自定义吸附行为

你可以通过 SnappableController 来控制吸附行为。以下是一个使用 SnappableController 的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Snappable Example'),
        ),
        body: Center(
          child: Snappable(
            controller: SnappableController(),
            snapOnTap: true,
            onSnapped: (snapped) {
              print('Snapped: $snapped');
            },
            child: Container(
              width: 200,
              height: 200,
              color: Colors.blue,
              child: Center(
                child: Text(
                  'Drag Me',
                  style: TextStyle(color: Colors.white, fontSize: 20),
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

使用 SnappableController 控制吸附

你可以通过 SnappableController 来手动控制吸附行为:

SnappableController _controller = SnappableController();

void _snap() {
  _controller.snap();
}

void _unsnap() {
  _controller.unsnap();
}

然后在你的 UI 中调用这些方法:

ElevatedButton(
  onPressed: _snap,
  child: Text('Snap'),
),
ElevatedButton(
  onPressed: _unsnap,
  child: Text('Unsnap'),
),
回到顶部