Flutter可拖动排序列表插件animated_reorderable_list的使用

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

Flutter可拖动排序列表插件animated_reorderable_list的使用

animated_reorderable_list

animated_reorderable_list 是一个功能强大且易于使用的Flutter库,它实现了带有拖放功能的动画列表和网格。

功能特性

  • ✅ 在项目插入和移除时提供平滑过渡动画。
  • ✅ 支持ListView和GridView的拖拽排序,并带有动画效果。
  • ✅ 可同时进行动画和重新排序。
  • ✅ 通过更新列表即可实现项目的动画效果。
  • ✅ 提供了多种内置动画(如淡入、缩放、滑动、翻转等)。
  • ✅ 支持列表和网格布局。
  • ✅ 支持大列表,按需创建视口中的项。
  • ✅ 启用/禁用拖拽功能。
  • ✅ 控制项目重新排序或锁定项目。

示例代码

添加依赖

pubspec.yaml文件中添加以下依赖:

dependencies:
  animated_reorderable_list: ^latest_version

安装包:

flutter pub get

导入库

import 'package:animated_reorderable_list/animated_reorderable_list.dart';

使用示例

AnimatedReorderableListView
AnimatedReorderableListView(
  items: list,
  itemBuilder: (BuildContext context, int index) {
    final user = list[index];
    return ItemTile(
      key: ValueKey(user.id),
      id: user.id,
    );
  },
  enterTransition: [SlideInDown()],
  exitTransition: [SlideInUp()],
  insertDuration: const Duration(milliseconds: 300),
  removeDuration: const Duration(milliseconds: 300),
  dragStartDelay: const Duration(milliseconds: 300),
  onReorder: (int oldIndex, int newIndex) {
    setState(() {
      final User user = list.removeAt(oldIndex);
      list.insert(newIndex, user);
    });
  },
  isSameItem: (a, b) => a.id == b.id
)
AnimatedReorderableGridView
AnimatedReorderableGridView(
  items: list,
  itemBuilder: (BuildContext context, int index) {
    final user = list[index];
    return ItemCard(
      key: ValueKey(user.id),
      id: user.id,
    );
  },
  sliverGridDelegate: SliverReorderableGridDelegateWithFixedCrossAxisCount(
      crossAxisCount: 4),
  enterTransition: [FlipInX(), ScaleIn()],
  exitTransition: [SlideInLeft()],
  insertDuration: const Duration(milliseconds: 300),
  removeDuration: const Duration(milliseconds: 300),
  onReorder: (int oldIndex, int newIndex) {
    setState(() {
      final User user = list.removeAt(oldIndex);
      list.insert(newIndex, user);
    });
  },
  dragStartDelay: const Duration(milliseconds: 300),
  isSameItem: (a, b) => a.id == b.id,
)

完整示例Demo

下面是一个完整的示例,展示了如何使用animated_reorderable_list来创建一个可以拖拽排序的列表:

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

void main() {
  runApp(const MaterialApp(title: 'Animated Reorderable List', home: HomePage()));
}

class User {
  final String name;
  final int id;

  User({required this.name, required this.id});
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  List<User> list = [];

  @override
  void initState() {
    super.initState();
    list = List.generate(8, (index) => User(name: "User $index", id: index));
  }

  void insert() {
    setState(() {
      list.insert(1, User(name: "User ${list.length}", id: list.length));
    });
  }

  void remove() {
    setState(() {
      if (list.isNotEmpty && list.length > 1) list.removeAt(1);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Animated Reorderable List'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: [
                ElevatedButton(onPressed: insert, child: const Text('Insert')),
                ElevatedButton(onPressed: remove, child: const Text('Remove')),
              ],
            ),
            Expanded(
              child: AnimatedReorderableListView(
                items: list,
                itemBuilder: (BuildContext context, int index) {
                  final user = list[index];
                  return ListTile(
                    key: ValueKey(user.id),
                    title: Text(user.name),
                  );
                },
                enterTransition: [SlideInDown()],
                exitTransition: [SlideInUp()],
                insertDuration: const Duration(milliseconds: 300),
                removeDuration: const Duration(milliseconds: 300),
                dragStartDelay: const Duration(milliseconds: 300),
                onReorder: (int oldIndex, int newIndex) {
                  setState(() {
                    final User user = list.removeAt(oldIndex);
                    list.insert(newIndex, user);
                  });
                },
                isSameItem: (a, b) => a.id == b.id,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

这个示例展示了如何使用AnimatedReorderableListView创建一个简单的用户列表,并允许用户通过拖拽来重新排序列表项。此外,还提供了插入和删除列表项的功能。

希望这些信息能帮助你更好地理解和使用animated_reorderable_list插件!如果你有任何问题或需要进一步的帮助,请随时提问。


更多关于Flutter可拖动排序列表插件animated_reorderable_list的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter可拖动排序列表插件animated_reorderable_list的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用animated_reorderable_list插件来实现可拖动排序列表的一个简单示例。

首先,确保你已经在你的pubspec.yaml文件中添加了animated_reorderable_list依赖:

dependencies:
  flutter:
    sdk: flutter
  animated_reorderable_list: ^0.6.0  # 请确保使用最新版本

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

接下来是一个完整的示例代码,展示如何使用animated_reorderable_list来创建一个可拖动排序的列表:

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  // 示例列表数据
  List<String> items = List<String>.generate(10, (i) => "Item ${i + 1}");

  // 处理列表项重排序的方法
  void onReorder(int oldIndex, int newIndex) {
    if (oldIndex < newIndex) {
      newIndex -= 1;
    }
    final String item = items.removeAt(oldIndex);
    items.insert(newIndex, item);
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Animated Reorderable List Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: AnimatedReorderableListView(
          onReorder: onReorder,
          padding: EdgeInsets.zero,
          child: ListView.builder(
            itemCount: items.length,
            itemBuilder: (context, index) {
              return ListTile(
                key: ValueKey(items[index]),  // 必须使用唯一的Key
                title: Text(items[index]),
              );
            },
          ),
        ),
      ),
    );
  }
}

解释

  1. 依赖安装:在pubspec.yaml文件中添加animated_reorderable_list依赖。
  2. 数据准备:在_MyHomePageState类中,创建一个包含10个字符串项的列表items
  3. 重排序处理:定义一个onReorder方法,该方法会在列表项被拖动时调用,并更新列表的顺序。
  4. UI构建:使用AnimatedReorderableListView来包裹ListView.builderListView.builder用于生成列表项。每个列表项使用ListTile,并为其分配一个唯一的ValueKey

注意事项

  • Key的使用:确保每个列表项都有一个唯一的Key,这对于动画效果和状态管理至关重要。
  • 动画效果animated_reorderable_list插件已经内置了动画效果,因此在拖动和放置列表项时会自动触发这些动画。

这个示例展示了如何使用animated_reorderable_list插件来创建一个简单的可拖动排序列表。你可以根据需要对代码进行扩展和修改,例如添加更多复杂的UI元素或处理更多的数据逻辑。

回到顶部