🧩ReorderableListView
Что такое ReorderableListView
ReorderableListView
ReorderableListView
— это виджет в Flutter, который позволяет пользователям изменять порядок элементов в списке с помощью перетаскивания. Представьте себе, что у вас есть список задач, и вы хотите, чтобы пользователи могли легко менять порядок выполнения этих задач, просто перетаскивая их вверх или вниз в списке. ReorderableListView
делает это возможным и интуитивно понятным.
Пример использования
Вот пример, как можно использовать ReorderableListView
для создания простого списка задач:

import 'package:flutter/material.dart';
class ReorderableListViewExample extends StatefulWidget {
const ReorderableListViewExample({super.key});
@override
_ReorderableListViewExampleState createState() =>
_ReorderableListViewExampleState();
}
class _ReorderableListViewExampleState
extends State<ReorderableListViewExample> {
List<String> _items = ["Task 1", "Task 2", "Task 3", "Task 4"];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('ReorderableListView Example')),
body: ReorderableListView(
onReorder: _onReorder,
children: [
for (final item in _items)
Container(
key: ValueKey(item),
height: 100,
margin: const EdgeInsets.all(10),
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.grey[200],
border: Border.all(color: Colors.grey),
),
child: ListTile(
key: ValueKey(item),
title: Text(item),
trailing: const Icon(Icons.drag_handle),
),
),
],
),
);
}
void _onReorder(int oldIndex, int newIndex) {
setState(() {
if (newIndex > oldIndex) {
newIndex--;
}
final item = _items.removeAt(oldIndex);
_items.insert(newIndex, item);
});
}
}
ReorderableListView: Это основной виджет, который позволяет изменять порядок элементов в списке.
onReorder: Это функция, которая вызывается при изменении порядка элементов. В ней мы обновляем список элементов.
children: Список виджетов, которые будут отображаться в
ReorderableListView
. Каждый элемент должен иметь уникальный ключ, чтобы Flutter мог отслеживать изменения.
Зачем это нужно
ReorderableListView
полезен, когда вам нужно предоставить пользователям возможность изменять порядок элементов в списке. Это может быть полезно в различных приложениях, таких как:
Списки задач
Приложения для заметок
Приложения для управления проектами
Все настройки ReorderableListView
ReorderableListView
List<Widget> children
Описание: Список виджетов, которые будут отображаться в
ReorderableListView
. Каждый виджет должен иметь уникальный ключ.Пример:
children: [ // Список элементов ListTile(key: ValueKey('item1'), title: Text('Item 1')), ListTile(key: ValueKey('item2'), title: Text('Item 2')), ]
void Function(int, int) onReorder
Описание: Функция, которая вызывается при изменении порядка элементов. Принимает два параметра: старый индекс и новый индекс.
Пример:
onReorder: (oldIndex, newIndex) { // Логика изменения порядка }
void Function(int)? onReorderStart
Описание: Функция, которая вызывается, когда начинается процесс перетаскивания элемента. Принимает индекс перетаскиваемого элемента.
Пример:
onReorderStart: (index) { // Логика при начале перетаскивания }
void Function(int)? onReorderEnd
Описание: Функция, которая вызывается, когда заканчивается процесс перетаскивания элемента. Принимает индекс элемента.
Пример:
onReorderEnd: (index) { // Логика при завершении перетаскивания }
double? itemExtent
Описание: Задает фиксированную высоту (или ширину, если горизонтальная прокрутка) для элементов списка. Это может улучшить производительность, если у вас есть фиксированные размеры.
Пример:
itemExtent: 70.0 // Высота каждого элемента 70 пикселей
double? Function(int, SliverLayoutDimensions)? itemExtentBuilder
Описание: Функция, которая позволяет задать высоту элементов на основе их индекса и размеров.
Пример:
itemExtentBuilder: (index, dimensions) { return dimensions.getBoxConstraints().maxHeight; // Возвращает максимальную высоту элемента }
Widget? prototypeItem
Описание: Шаблон элемента, который используется для определения размеров элементов, пока они перетаскиваются. Это помогает улучшить плавность анимации.
Пример:
prototypeItem: ListTile(title: Text('Prototype Item')) // Шаблон элемента
Widget Function(Widget, int, Animation<double>)? proxyDecorator
Описание: Функция, которая позволяет настроить внешний вид элемента во время перетаскивания. Она возвращает виджет, который будет отображаться вместо элемента, пока он перетаскивается.
Пример:
proxyDecorator: (child, index, animation) { return Opacity(opacity: animation.value, child: child); // Прозрачность во время перетаскивания }
bool buildDefaultDragHandles = true
Описание: Указывает, нужно ли строить стандартные ручки для перетаскивания элементов. Если false, вы можете предоставить свои собственные ручки.
Пример:
buildDefaultDragHandles: false // Использовать свои ручки
EdgeInsets? padding
Описание: Устанавливает отступы вокруг списка.
Пример:
padding: EdgeInsets.all(8.0) // Отступы вокруг списка
Widget? header
Описание: Заголовок, который будет отображаться над списком.
Пример:
header: Text('My Tasks') // Заголовок списка
Widget? footer
Описание: Подвал, который будет отображаться под списком.
Пример:
footer: Text('End of Tasks') // Подвал списка
Axis scrollDirection = Axis.vertical
Описание: Указывает направление прокрутки списка (вертикально или горизонтально).
Пример:
scrollDirection: Axis.horizontal // Прокрутка по горизонтали
bool reverse = false
Описание: Если true, прокрутка будет в обратном порядке (с конца к началу).
Пример:
reverse: true // Прокрутка в обратном порядке
ScrollController? scrollController
Описание: Позволяет управлять прокруткой программно.
Пример:
scrollController: ScrollController() // Контроллер для управления прокруткой
bool? primary
Описание: Указывает, является ли этот виджет основным для прокрутки. Если true, прокрутка будет связана с родительским виджетом.
Пример:
primary: true // Этот виджет является основным для прокрутки
ScrollPhysics? physics
Описание: Определяет поведение прокрутки, например, пружинный эффект или замедление.
Пример:
physics: BouncingScrollPhysics() // Прокрутка с эффектом пружины
bool shrinkWrap = false
Описание: Если true, размер виджета будет уменьшен до минимально необходимого для отображения содержимого.
Пример:
shrinkWrap: true // Уменьшение размера до минимального необходимого
double anchor = 0.0
Описание: Определяет точку, вокруг которой будет происходить прокрутка. Значение от 0.0 до 1.0, где 0.0 — это верхняя часть, а 1.0 — нижняя часть.
Пример:
anchor: 0.5 // Прокрутка вокруг средней точки
double? cacheExtent
Описание: Определяет, сколько пикселей нужно кэшировать за пределами видимого пространства.
Пример:
cacheExtent: 1000.0 // Кэширование 1000 пикселей за пределами видимости
DragStartBehavior dragStartBehavior = DragStartBehavior.start
Описание: Определяет поведение, когда начинается перетаскивание. Может быть "start" или "down".
Пример:
dragStartBehavior: DragStartBehavior.down // Начало перетаскивания по нажатию
ScrollViewKeyboardDismissBehavior keyboardDismissBehavior = ScrollViewKeyboardDismissBehavior.manual
Описание: Определяет, как клавиатура будет скрываться при прокрутке списка.
Пример:
keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag // Скрытие клавиатуры при перетаскивании
String? restorationId
Описание: Идентификатор для восстановления состояния виджета после перезапуска приложения.
Пример:
restorationId: 'reorderable_list' // Идентификатор для восстановления
Clip clipBehavior = Clip.hardEdge
Описание: Указывает, как будут обрабатываться элементы, выходящие за пределы виджета. Может быть "hardEdge", "antiAlias", "none".
Пример:
clipBehavior: Clip.antiAlias // Антиалиасинг для элементов
double? autoScrollerVelocityScalar
Описание: Указывает скорость прокрутки во время перетаскивания, когда элемент находится рядом с краем списка.
Пример:
autoScrollerVelocityScalar: 1.5 // Скорость прокрутки в 1.5 раза выше
Заключение
ReorderableListView
— это мощный инструмент для создания интерактивных списков, которые пользователи могут настраивать по своему усмотрению. Используя его, вы можете создавать удобные и интуитивно понятные интерфейсы для ваших приложений.
Last updated