Flutter可排序列表插件sortable_list的使用

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

Flutter可排序列表插件sortable_list的使用

SortableList 是一个 Flutter 列表组件,允许用户拖放列表项,并可以自定义拖动手柄。本文将详细介绍如何在 Flutter 应用程序中使用 SortableList

获取开始

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

dependencies:
  sortable_list: ^latest_version

然后运行 flutter pub get 来安装该包。

接下来,我们将通过一个简单的示例来展示如何使用 SortableList

基本用法

你可以通过以下方式将 SortableList 添加到你的应用中:

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('可排序列表示例')),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: SortableList<String>(
            items: ['Tuna', 'Meat', 'Cheese', 'Potato', 'Eggs', 'Bread'],
            itemExtent: 72.0,
            builder: (context, item, handle) {
              return Container(
                height: 72.0,
                child: Row(children: [
                  Spacer(),
                  Text(item),
                  Spacer(),
                  handle,
                ]),
              );
            },
          ),
        ),
      ),
    );
  }
}

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

自定义拖动手柄

除了默认的手柄,你还可以提供自定义的手柄构建器。例如:

child: SortableList<String>(
  items: ['Tuna', 'Meat', 'Cheese', 'Potato', 'Eggs', 'Bread'],
  itemExtent: 72.0,
  handleBuilder: (context) {
    return Padding(
      padding: EdgeInsets.all(16.0),
      child: Container(
        color: Colors.green,
        child: Text('Handle'),
      ),
    );
  },
  builder: (context, item, handle) {
    return Container(
      height: 72.0,
      child: Row(children: [
        Spacer(),
        Text(item),
        Spacer(),
        handle,
      ]),
    );
  },
),

其他可选参数

SortableList 还提供了其他一些可选参数,如动画持续时间、拖动延迟、手柄对齐方式等。例如:

child: SortableList<String>(
  items: ['Tuna', 'Meat', 'Cheese', 'Potato', 'Eggs', 'Bread'],
  itemExtent: 72.0,
  builder: (context, item, handle) {
    return Container(
      height: 72.0,
      child: Row(children: [
        Spacer(),
        Text(item),
        Spacer(),
        handle,
      ]),
    );
  },
  animDuration: Duration(milliseconds: 500),
  dragDelay: Duration(seconds: 1),
  handleAlignment: -0.3,
  scrollDirection: Axis.horizontal,
  onItemReorder: (from, to) {
    // 处理重新排序事件
  },
),

无手柄模式

如果你希望列表项可以在任何地方被拖动,可以使用 handleless 构造函数:

SortableList<String>.handleless(
  items: ['Tuna', 'Meat', 'Cheese', 'Potato', 'Eggs', 'Bread'],
  itemExtent: 72.0,
  builder: (context, item) {
    return Container(
      height: 72.0,
      child: Center(child: Text(item)),
    );
  },
);

完整示例

下面是一个完整的示例代码,展示了如何使用 SortableList 创建一个可拖动的国家列表:

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

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

class CountriesPage extends StatelessWidget {
  final _itemHeight = 72.0;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'SortableList example',
      home: Scaffold(
        appBar: AppBar(title: Text('最大国家列表')),
        body: Padding(
          padding: EdgeInsets.all(16.0),
          child: SortableList<String>(
            items: _countries,
            itemExtent: _itemHeight,
            handleBuilder: (_) => AnimatedIcon(
              icon: AnimatedIcons.menu_arrow,
              progress: AlwaysStoppedAnimation(0.0),
            ),
            feedbackHandleBuilder: (_, transition) => AnimatedIcon(
              icon: AnimatedIcons.menu_arrow,
              progress: transition,
            ),
            itemBuilder: (_, item, handle) => Container(
              height: _itemHeight,
              child: Padding(
                padding: EdgeInsets.all(8.0),
                child: Row(children: [
                  Expanded(child: Center(child: Text(item.value))),
                  handle,
                ]),
              ),
            ),
          ),
        ),
      ),
    );
  }

  final _countries = [
    'Russia',
    'China',
    'United States',
    'Canada',
    'Brazil',
    'Australia',
    'India',
    'Argentina',
    'Kazakhstan',
    'Algeria',
    'DR Congo',
    'Saudi Arabia',
    'Mexico',
    'Indonesia',
    'Sudan',
    'Libya',
    'Iran',
    'Mongolia',
    'Peru',
    'Niger',
  ];
}

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

1 回复

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


sortable_list 是一个 Flutter 插件,用于创建可以拖拽排序的列表。它允许用户通过拖拽列表项来重新排序列表中的元素。使用 sortable_list 可以轻松实现类似于移动应用中常见的拖拽排序功能。

安装

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

dependencies:
  flutter:
    sdk: flutter
  sortable_list: ^0.1.0  # 请检查最新版本

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

基本用法

以下是一个简单的示例,展示了如何使用 sortable_list 插件创建一个可以拖拽排序的列表:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Sortable List Example'),
        ),
        body: SortableListExample(),
      ),
    );
  }
}

class SortableListExample extends StatefulWidget {
  @override
  _SortableListExampleState createState() => _SortableListExampleState();
}

class _SortableListExampleState extends State<SortableListExample> {
  List<String> items = ['Item 1', 'Item 2', 'Item 3', 'Item 4', 'Item 5'];

  @override
  Widget build(BuildContext context) {
    return SortableList(
      itemCount: items.length,
      itemBuilder: (context, index) {
        return Card(
          child: ListTile(
            title: Text(items[index]),
          ),
        );
      },
      onUpdate: (oldIndex, newIndex) {
        setState(() {
          final item = items.removeAt(oldIndex);
          items.insert(newIndex, item);
        });
      },
    );
  }
}

代码解释

  1. SortableList 组件:

    • itemCount: 列表项的数量。
    • itemBuilder: 用于构建每个列表项的回调函数。
    • onUpdate: 当用户拖拽并释放列表项时触发的回调函数。oldIndex 是原始位置,newIndex 是新位置。
  2. onUpdate 回调:

    • 在这个回调中,我们通过 setState 更新 items 列表的顺序。先将 oldIndex 处的元素移除,然后将其插入到 newIndex 处。
  3. ListTile 和 Card:

    • 使用 ListTileCard 组件来美化列表项的外观。

自定义选项

sortable_list 还提供了一些自定义选项,例如:

  • dragHandle: 你可以指定一个拖拽手柄,只有通过该手柄才能拖拽列表项。
  • onStart: 拖拽开始时的回调。
  • onEnd: 拖拽结束时的回调。

示例:添加拖拽手柄

SortableList(
  itemCount: items.length,
  itemBuilder: (context, index) {
    return Card(
      child: ListTile(
        leading: Icon(Icons.drag_handle),  // 拖拽手柄
        title: Text(items[index]),
      ),
    );
  },
  onUpdate: (oldIndex, newIndex) {
    setState(() {
      final item = items.removeAt(oldIndex);
      items.insert(newIndex, item);
    });
  },
  dragHandle: DragHandle(
    child: Icon(Icons.drag_handle),
  ),
);
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!