👨‍💻
Flutter
  • 👨‍💻Flutter lessons
    • 🎨Flutter ui
      • 🚵‍♂️Travel app
        • 📱1. Lesson
        • 📱2.Lesson
      • 📚Books store
      • 🧑‍⚕️Doctor app
      • 🚖Taxi app
    • 🐦Основы Flutter
      • Page 1
      • Page 2
      • 🧑‍🏫Урок 1: Основные виджеты Flutter
        • Page
        • 🧩Container()
        • 🧩AppBar()
        • 🧩Text()
        • 🧩Icon()
        • 🧩Column()
        • 🧩Row()
        • 🧩TextButton()
        • 🧩ElevatedButton()
      • 🧑‍🏫Урок 2: Создаем UI
      • 🧑‍🏫Урок 3: Создаем UI
      • 🧑‍🏫Урок 4: Создаем UI
    • 🧩Основы dart
      • 🧑‍🏫01. Переменные часть 1
      • 🧑‍🏫01. Переменные часть 2
      • 🧑‍🏫02. Функции
      • 🧑‍🏫03. Условные операторы
      • 🧑‍🏫04. List
      • 🧑‍🏫05. Map
      • 🧑‍🏫06. Class
      • 🧑‍🏫07. Наследование
      • 🧑‍🏫08. Абстракция
      • 🧑‍🏫09. Интерфейсы
      • 🧑‍🏫10. Инкапсуляция
      • 🧑‍🏫11. Mixin
      • 🧑‍🏫12. Асинхронное программирование
      • 🧑‍🏫13. Streams
      • 🎯Final project
        • 🥦Grocery app
        • 🏠Home
    • ⚒️State management
      • ⬛Bloc
        • 1. Введение cubit
          • 1.1 Пример
          • 1.2 Пример
          • 1.3 Пример
          • 1.4 Пример
          • 1.5 Пример
        • 2. Введение в Bloc
      • 🌊Riverpod
    • 🏠Architechture
      • Clean Architechture
      • Bloc
    • 📲Locale storage
      • 🐝Hive
        • 🐝Ui
        • 🐝Hive - локальное хранилище: Введение
        • 🐝Hive - task app: часть 1
        • 🐝Hive - task app: часть 2
        • 🐝Hive - task app: часть 3
        • 🐝Hive - task app: часть 4
        • 🐝Hive - task app: часть 5
      • 🟩Sql
    • 📡Server
      • 📡Server - Lesson01 introduction
      • 📡Server - Lesson02 get data
      • 📡Server - Lesson03 News App get data
    • 🖥️Готовый backend
      • Firebase
      • Supabase
  • 🎯Dart practise
    • 🧑‍💻Переменные
      • 🧑‍💻String
      • 🧑‍💻int
      • 🧑‍💻double
      • 🧑‍💻bool
    • 🧑‍💻Функции
      • 🧑‍💻Обычные функции
      • 🧑‍💻Порядковые параметры
      • 🧑‍💻Обязательные параметры
      • 🧑‍💻Параметры по умолчанию
      • 🧑‍💻Функции-стрелки
      • 🧑‍💻Возвращаемые функции
    • 🧑‍💻Условные операторы
      • 🧑‍💻if/else
      • 🧑‍💻switch/case
      • 🧑‍💻тернарный оператор
    • 🧑‍💻Структура данных
      • 🧑‍💻List
      • 🧑‍💻Map
      • 🧑‍💻Set
    • 🧑‍💻ООП
  • 🧩Flutter Widgets
    • 💻Все виджеты
    • 🎞️Анимации
      • 🧩AnimatedContainer
      • 🧩AnimatedOpacity
      • 🧩AnimatedAlign
      • 🧩AnimatedCrossFade
      • 🧩Hero
      • 🧩AnimatedBuilder
      • 🧩AnimatedPositioned
      • 🧩AnimatedSwitcher
    • 🏗️Манипуляция пространством
      • 🧩Padding
      • 🧩SizedBox
      • 🧩Align
      • 🧩Center
      • 🧩Expanded
      • 🧩Flexible
      • 🧩Spacer
      • 🧩Column
      • 🧩Stack
      • 🧩Row
    • ✍️Отображение текста
      • 🧩RichText
      • 🧩FittedBox
      • 🧩SelectableText
      • 🧩Text
    • 📸Отображение изображений
      • 🧩Image()
      • 🧩Image.network
      • 🧩Image.asset
      • 🧩Image.file
      • 🧩Image.memory
      • 🧩FadeInImage
      • 🧩NetworkImage
      • 🧩AssetImage
    • 📃Списки и прокрутка
      • 🧩ListView()
      • 🧩ListView.builder()
      • 🧩GridView()
      • 🧩GridView.builder()
      • 🧩PageView()
      • 🧩SingleChildScrollView
      • 🧩CustomScrollView
      • 🧩ReorderableListView
      • 🧩NestedScrollView
    • ⌨️Кнопки
      • 🧩TextButton()
      • 🧩ElevatedButton()
      • 🧩IconButton()
      • 🧩DropDownButton()
      • 🧩FloatingActionButton
      • 🧩Checkbox
      • 🧩Radio
      • 🧩Switch
      • 🧩Slider
    • 📝Формы и ввод данных
      • 🧩TextField()
      • 🧩TextFormField
      • 🧩Form
      • 🧩FormField
      • 🧩DatePicker
      • 🧩TimePicker
    • 🧑‍🏫Диалоги и всплывающие окна
      • 🧩AlertDialog
      • 🧩SimpleDialog
      • 🧩BottomSheet
      • 🧩ExpansionPanel
      • 🧩SnackBar
      • 🧩PopupMenuButton
      • 🧩Tooltip
      • 🧩Dialog
    • 🛣️Навигация
      • 🧩BottomNavigationBar()
      • 🧩Navigator
      • 🧩Drawer
      • 🧩TabBar
    • 📱Отображение на экране
      • 🧩Scaffold
      • 🧩Container()
      • 🧩AppBar()
      • 🧩Icon()
      • 🧩Stepper()
  • 🎮Flutter Flame
    • Введение в разработку игр
  • 🔬Flutter projects
  • 🧑‍🎓Homeworks for everyday
    • 🧑‍🎓0. Переменные
    • 🧑‍🎓1. Функции - 1
    • 🧑‍🎓2. Функции - 2
    • 🧑‍🎓3. Условные операторы
    • 🧑‍🎓4. List
    • 🧑‍🎓5. Map
    • 🧑‍🎓6. class
    • 🐝Hive -
    • 🐝Hive clean architecture
    • 📡HTTP
    • 📡HTTP clean architecture
    • 💾Firebase
    • 💾Firebase clean architecture
Powered by GitBook
On this page
  1. Flutter Widgets
  2. Списки и прокрутка

ReorderableListView

PreviousCustomScrollViewNextNestedScrollView

Last updated 6 months ago

Что такое 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);
    });
  }
}
  1. ReorderableListView: Это основной виджет, который позволяет изменять порядок элементов в списке.

  2. onReorder: Это функция, которая вызывается при изменении порядка элементов. В ней мы обновляем список элементов.

  3. children: Список виджетов, которые будут отображаться в ReorderableListView. Каждый элемент должен иметь уникальный ключ, чтобы Flutter мог отслеживать изменения.

Зачем это нужно

ReorderableListView полезен, когда вам нужно предоставить пользователям возможность изменять порядок элементов в списке. Это может быть полезно в различных приложениях, таких как:

  • Списки задач

  • Приложения для заметок

  • Приложения для управления проектами

Все настройки ReorderableListView

  1. List<Widget> children

    • Описание: Список виджетов, которые будут отображаться в ReorderableListView. Каждый виджет должен иметь уникальный ключ.

    • Пример:

      children: [ // Список элементов
        ListTile(key: ValueKey('item1'), title: Text('Item 1')),
        ListTile(key: ValueKey('item2'), title: Text('Item 2')),
      ]
  2. void Function(int, int) onReorder

    • Описание: Функция, которая вызывается при изменении порядка элементов. Принимает два параметра: старый индекс и новый индекс.

    • Пример:

      onReorder: (oldIndex, newIndex) {
        // Логика изменения порядка
      }
  3. void Function(int)? onReorderStart

    • Описание: Функция, которая вызывается, когда начинается процесс перетаскивания элемента. Принимает индекс перетаскиваемого элемента.

    • Пример:

      onReorderStart: (index) {
        // Логика при начале перетаскивания
      }
  4. void Function(int)? onReorderEnd

    • Описание: Функция, которая вызывается, когда заканчивается процесс перетаскивания элемента. Принимает индекс элемента.

    • Пример:

      onReorderEnd: (index) {
        // Логика при завершении перетаскивания
      }
  5. double? itemExtent

    • Описание: Задает фиксированную высоту (или ширину, если горизонтальная прокрутка) для элементов списка. Это может улучшить производительность, если у вас есть фиксированные размеры.

    • Пример:

      itemExtent: 70.0 // Высота каждого элемента 70 пикселей
  6. double? Function(int, SliverLayoutDimensions)? itemExtentBuilder

    • Описание: Функция, которая позволяет задать высоту элементов на основе их индекса и размеров.

    • Пример:

      itemExtentBuilder: (index, dimensions) {
        return dimensions.getBoxConstraints().maxHeight; // Возвращает максимальную высоту элемента
      }
  7. Widget? prototypeItem

    • Описание: Шаблон элемента, который используется для определения размеров элементов, пока они перетаскиваются. Это помогает улучшить плавность анимации.

    • Пример:

      prototypeItem: ListTile(title: Text('Prototype Item')) // Шаблон элемента
  8. Widget Function(Widget, int, Animation<double>)? proxyDecorator

    • Описание: Функция, которая позволяет настроить внешний вид элемента во время перетаскивания. Она возвращает виджет, который будет отображаться вместо элемента, пока он перетаскивается.

    • Пример:

      proxyDecorator: (child, index, animation) {
        return Opacity(opacity: animation.value, child: child); // Прозрачность во время перетаскивания
      }
  9. bool buildDefaultDragHandles = true

    • Описание: Указывает, нужно ли строить стандартные ручки для перетаскивания элементов. Если false, вы можете предоставить свои собственные ручки.

    • Пример:

      buildDefaultDragHandles: false // Использовать свои ручки
  10. EdgeInsets? padding

    • Описание: Устанавливает отступы вокруг списка.

    • Пример:

      padding: EdgeInsets.all(8.0) // Отступы вокруг списка
  11. Widget? header

    • Описание: Заголовок, который будет отображаться над списком.

    • Пример:

      header: Text('My Tasks') // Заголовок списка
  12. Widget? footer

    • Описание: Подвал, который будет отображаться под списком.

    • Пример:

      footer: Text('End of Tasks') // Подвал списка
  13. Axis scrollDirection = Axis.vertical

    • Описание: Указывает направление прокрутки списка (вертикально или горизонтально).

    • Пример:

      scrollDirection: Axis.horizontal // Прокрутка по горизонтали
  14. bool reverse = false

    • Описание: Если true, прокрутка будет в обратном порядке (с конца к началу).

    • Пример:

      reverse: true // Прокрутка в обратном порядке
  15. ScrollController? scrollController

    • Описание: Позволяет управлять прокруткой программно.

    • Пример:

      scrollController: ScrollController() // Контроллер для управления прокруткой
  16. bool? primary

    • Описание: Указывает, является ли этот виджет основным для прокрутки. Если true, прокрутка будет связана с родительским виджетом.

    • Пример:

      primary: true // Этот виджет является основным для прокрутки
  17. ScrollPhysics? physics

    • Описание: Определяет поведение прокрутки, например, пружинный эффект или замедление.

    • Пример:

      physics: BouncingScrollPhysics() // Прокрутка с эффектом пружины
  18. bool shrinkWrap = false

    • Описание: Если true, размер виджета будет уменьшен до минимально необходимого для отображения содержимого.

    • Пример:

      shrinkWrap: true // Уменьшение размера до минимального необходимого
  19. double anchor = 0.0

    • Описание: Определяет точку, вокруг которой будет происходить прокрутка. Значение от 0.0 до 1.0, где 0.0 — это верхняя часть, а 1.0 — нижняя часть.

    • Пример:

      anchor: 0.5 // Прокрутка вокруг средней точки
  20. double? cacheExtent

    • Описание: Определяет, сколько пикселей нужно кэшировать за пределами видимого пространства.

    • Пример:

      cacheExtent: 1000.0 // Кэширование 1000 пикселей за пределами видимости
  21. DragStartBehavior dragStartBehavior = DragStartBehavior.start

    • Описание: Определяет поведение, когда начинается перетаскивание. Может быть "start" или "down".

    • Пример:

      dragStartBehavior: DragStartBehavior.down // Начало перетаскивания по нажатию
  22. ScrollViewKeyboardDismissBehavior keyboardDismissBehavior = ScrollViewKeyboardDismissBehavior.manual

    • Описание: Определяет, как клавиатура будет скрываться при прокрутке списка.

    • Пример:

      keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag // Скрытие клавиатуры при перетаскивании
  23. String? restorationId

    • Описание: Идентификатор для восстановления состояния виджета после перезапуска приложения.

    • Пример:

      restorationId: 'reorderable_list' // Идентификатор для восстановления
  24. Clip clipBehavior = Clip.hardEdge

    • Описание: Указывает, как будут обрабатываться элементы, выходящие за пределы виджета. Может быть "hardEdge", "antiAlias", "none".

    • Пример:

      clipBehavior: Clip.antiAlias // Антиалиасинг для элементов
  25. double? autoScrollerVelocityScalar

    • Описание: Указывает скорость прокрутки во время перетаскивания, когда элемент находится рядом с краем списка.

    • Пример:

      autoScrollerVelocityScalar: 1.5 // Скорость прокрутки в 1.5 раза выше

Заключение

ReorderableListView — это мощный инструмент для создания интерактивных списков, которые пользователи могут настраивать по своему усмотрению. Используя его, вы можете создавать удобные и интуитивно понятные интерфейсы для ваших приложений.

🧩
📃
🧩