sticky_header_reordering_list

A Flutter widget to create reordering lists with sticky headers, making it easy to group items by sections, reorder them with drag-and-drop functionality, and optionally add customizable dividers between list items.

Features

  • Group items into sections using custom extractors.
  • Display sticky headers for each section.
  • Enable drag-and-drop reordering of items within or across sections.
  • Add optional separators between list items with a customizable builder.
  • Fully customizable headers, items, and drag feedback.
  • Compatible with any type of data.

Installation

Add this package to your project by including it in the pubspec.yaml file:

dependencies:
  sticky_header_reordering_list: ^1.0.2

Import it in your Dart code:

import 'package:sticky_header_reordering_list/sticky_header_reordering_list.dart';

Usage

Here’s how to use StickyHeaderReorderingList in your Flutter application:

StickyHeaderReorderingList<Map<String, String>>(
  items: movies,
  sectionExtractor: (item) => item["genre"] ?? "",
  headerBuilder: (context, section) => Container(
    color: Colors.blue[400],
    padding: const EdgeInsets.all(8.0),
    child: Text(
        section,
        style: const TextStyle(
        fontWeight: FontWeight.bold,
        color: Colors.white,
      ),
    ),
  ),
  itemBuilder: (context, item) => Column(
    children: [
        ListTile(
          title: Text(item["title"] ?? "Unknown"),
        ),
      ],
    ),
  isReordering: true,
  onReorderElements: (data, oldItem, newItem, newIndex, oldIndex, groupedItems) {
    print("Reordered: $oldItem -> $newItem");
  },
  dividerBuilder: (context, index) => Divider(
    color: Colors.grey,
    thickness: 1,
    ),
),

Properties

The StickyHeaderReorderingList widget accepts the following properties:

Property Description Required Type Default
items The list of items to display. Yes List<T>
sectionExtractor Function to extract the section name from each item. Yes String Function(T)
headerBuilder Builder function for creating section headers. Yes Widget Function(BuildContext, String)
itemBuilder Builder function for creating list items. Yes Widget Function(BuildContext, T)
isReordering Determines whether drag-and-drop reordering is enabled. No bool false
onReorderElements Callback triggered during reordering of items. No void Function(...) null
heightOfFirstHeader The height of the first sticky header. No double 50
feedback Widget displayed during a drag-and-drop operation. No Widget? null
childWhenDragging Widget displayed in place of the dragged item. No Widget? null
dividerBuilder Builder function for creating a separator between items. No Widget Function(BuildContext, int)? null

Customization

Header Customization

Modify the appearance of headers using the headerBuilder property:

headerBuilder: (context, section) => Container(
  color: Colors.blueAccent,
  padding: const EdgeInsets.all(8.0),
  child: Text(
    section,
    style: const TextStyle(
      fontSize: 18,
      color: Colors.white,
    ),
  ),
)

Drag Feedback

Customize the feedback widget during dragging:

feedback: Material(
  elevation: 4.0,
  child: Container(
      color: Colors.amber,
      padding: const EdgeInsets.all(16.0),
      child: const Text("Dragging Item"),
  ),
)

Divider Customization

Add separators between list items using the dividerBuilder property. You can fully customize the appearance and behavior of the separators:

dividerBuilder: (context, index) => Divider(
    color: Colors.grey[400],
    thickness: 1,
    indent: 16,
    endIndent: 16,
),

The dividerBuilder is optional. If not provided, no separators will appear between the list items.

Feel free to customize the properties and behavior based on your specific needs!

Screenshots

Android

demo example Android

iOS

demo example iOS

Example App

For a complete working example, check out the example folder.

Coming Soon: sticky_header_reordering_grid

I'm excited to announce a new addition to the family! sticky_header_reordering_grid will bring all the features of sticky_header_reordering_list to a grid layout.

Stay tuned for updates as I develop this flexible widget for your Flutter applications!

License

This library is licensed under the BSD 3-Clause License. See the LICENSE file for details.


This library is designed to provide a flexible way to manage sticky headers and reordering lists in Flutter applications.