Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
679 of 1024 menu
◀ ▶

Виджет LongPressDraggable

Виджет LongPressDraggable ведёт себя как Draggable, но drag стартует после удержания пальца. Данные кладут в data, под указателем рисуют feedback, на месте оставляют child или childWhenDragging. Бросок принимает DragTarget.

Синтаксис

LongPressDraggable<String>( data: 'abcde', feedback: feedbackWidget, child: child, )

Параметры

Параметр Описание
child Виджет до начала перетаскивания.
feedback Виджет под пальцем во время drag.
data Данные для DragTarget.
childWhenDragging Замена child, пока feedback уехал.
onDragStarted Drag начался после long press.
onDragEnd Палец отпустили, drag завершён.

Пример

Давайте перетащим метку после долгого нажатия:

import 'package:flutter/material.dart'; class LongDragDemo extends StatefulWidget { const LongDragDemo({super.key}); @override State<LongDragDemo> createState() => _LongDragDemoState(); } class _LongDragDemoState extends State<LongDragDemo> { var slot = 'abcde'; @override Widget build(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ LongPressDraggable<String>( data: '12345', feedback: const Material( child: Padding( padding: EdgeInsets.all(8), child: Text('12345'), ), ), child: const Text('hold drag'), ), DragTarget<String>( onAcceptWithDetails: (details) { setState(() { slot = details.data; }); }, builder: (context, candidate, rejected) { return Container( width: 120, height: 80, color: Colors.teal.shade100, alignment: Alignment.center, child: Text(slot), ); }, ), ], ); } } void main() { runApp( MaterialApp( home: Scaffold( body: Center( child: LongDragDemo(), ), ), ), ); }

На экране короткое нажатие ничего не тащит; после удержания метка едет в зелёную область и меняет текст на '12345'.

Пример

Давайте покажем заглушку на месте во время drag:

import 'package:flutter/material.dart'; void main() { runApp( MaterialApp( home: Scaffold( body: Center( child: LongPressDraggable<String>( data: 'abcde', childWhenDragging: const SizedBox( width: 80, height: 40, ), feedback: Material( child: Container( padding: const EdgeInsets.all(12), color: Colors.pink.shade200, child: const Text('abcde'), ), ), child: Container( padding: const EdgeInsets.all(12), color: Colors.pink.shade200, child: const Text('12345'), ), ), ), ), ), ); }

На экране розовая плашка; после long press на месте пустой прямоугольник, под пальцем едет копия с 'abcde'.

Смотрите также

  • виджет Draggable,
    который начинает drag сразу при движении
  • виджет DragTarget,
    куда бросают data
  • виджет GestureDetector,
    у которого onLongPress без перетаскивания
  • виджет Dismissible,
    который убирает пункт смахиванием
← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить