superlistapp / super_native_extensions

Native drag & drop, clipboard access and context menu.
MIT License
364 stars 56 forks source link

[super_drag_and_drop] Scrolling on ListView throws error while dragging #343

Open LeoRc01 opened 1 month ago

LeoRc01 commented 1 month ago

In my project, I have a section made by a ListView which build a list of DropRegion. Inside of each DropRegion there can be a list of items wrapped by a DragItemWidget. The issue I am facing is that if I try to scroll the list while dragging an item, it throws some weird exceptions, but the software is still working fine.

Am I doing anything wrong?

Code sample for testing (not actual project) ```dart import 'package:flutter/material.dart'; import 'package:super_drag_and_drop/super_drag_and_drop.dart'; void main() { runApp(const MyApp()); } class MyData { DateTime date; List items; MyData({required this.date, List? items}) : items = items ?? []; } class DataHandler with ChangeNotifier { final List items; DataHandler() : items = List.generate( 20, (index) => MyData( date: DateTime(2024, 1, index + 1), items: ['Item: $index'])); void swapItems(DateTime fromDate, String itemToMove, DateTime toDate) { final oldIndex = items.indexWhere((element) => element.date == fromDate); items[oldIndex].items.remove(itemToMove); final newIndex = items.indexWhere((element) => element.date == toDate); items[newIndex].items.add(itemToMove); notifyListeners(); } } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold(body: DragAndDrop()), ); } } class DragAndDrop extends StatelessWidget { DragAndDrop({super.key}); final myHandler = DataHandler(); @override Widget build(BuildContext context) { return SizedBox( width: 200, child: ListenableBuilder( listenable: myHandler, builder: (context, child) => ListView.separated( itemBuilder: (context, index) => DateBlock( data: myHandler.items[index], myHandler: myHandler, ), separatorBuilder: (context, index) => const SizedBox(height: 5), itemCount: myHandler.items.length, ), ), ); } } class DateBlock extends StatelessWidget { const DateBlock({ super.key, required this.data, required this.myHandler, }); final MyData data; final DataHandler myHandler; @override Widget build(BuildContext context) { return DropRegion( onDropOver: (p0) { return DropOperation.move; }, formats: Formats.standardFormats, onPerformDrop: (PerformDropEvent event) async { final draggedItem = event.session.items.first.localData as (DateTime, String); myHandler.swapItems(draggedItem.$1, draggedItem.$2, data.date); }, child: Row( children: [ Text("Day: ${data.date.day.toString()}"), Expanded( child: ListView.separated( shrinkWrap: true, itemBuilder: (context, index) => DraggableListTile( item: data.items[index], date: data.date, ), separatorBuilder: (context, index) => const SizedBox(height: 5), itemCount: data.items.length, ), ), ], ), ); } } class DraggableListTile extends StatelessWidget { const DraggableListTile({ super.key, required this.item, required this.date, }); final DateTime date; final String item; @override Widget build(BuildContext context) { return DragItemWidget( allowedOperations: () => [DropOperation.move], dragItemProvider: (p0) { return DragItem( localData: (date, item), ); }, child: DraggableWidget( child: Container( //height: 100, padding: const EdgeInsets.all(15), color: Colors.red, child: Text(item), ), ), ); } } ```
This is the exception ```console ══╡ EXCEPTION CAUGHT BY GESTURES LIBRARY ╞══════════════════════════════════════════════════════════ The following assertion was thrown while handling a pointer data packet: Assertion failed: file:///Users/leonardo/Documents/flutter/packages/flutter/lib/src/gestures/events.dart:1566:15 !identical(kind, PointerDeviceKind.trackpad) is not true When the exception was thrown, this was the stack: dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 297:3 throw_ dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 38:3 assertFailed packages/flutter/src/gestures/events.dart 1566:50 new packages/flutter/src/gestures/converter.dart 146:26 dart-sdk/lib/internal/iterable.dart 403:20 moveNext dart-sdk/lib/internal/iterable.dart 882:20 moveNext dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 1140:20 next dart-sdk/lib/collection/queue.dart 753:14 addAll packages/flutter/src/gestures/binding.dart 297:7 [_handlePointerDataPacket] packages/super_native_extensions/src/web/drag_driver.dart 63:43 [_onPointerDataPacketInner] packages/super_native_extensions/src/web/drag_driver.dart 56:7 [_onPointerDataPacket] lib/_engine/engine/platform_dispatcher.dart 1361:5 invoke1 lib/_engine/engine/platform_dispatcher.dart 286:5 invokeOnPointerDataPacket lib/_engine/engine/pointer_binding.dart 398:30 [_sendToFramework] lib/_engine/engine/pointer_binding.dart 224:7 onPointerData lib/_engine/engine/pointer_binding.dart 717:14 [_handleWheelEvent] lib/_engine/engine/pointer_binding.dart 1022:7 dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 550:37 _checkAndCall dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 555:39 dcall ════════════════════════════════════════════════════════════════════════════════════════════════════ ```
Video demonstration https://github.com/superlistapp/super_native_extensions/assets/45425606/0ac37504-651c-4ba8-b581-881a8f442d2d
Doctor output ```console Doctor summary (to see all details, run flutter doctor -v): [✓] Flutter (Channel stable, 3.19.5, on macOS 14.2.1 23C71 darwin-arm64, locale it-IT) [✓] Android toolchain - develop for Android devices (Android SDK version 33.0.2) [✓] Xcode - develop for iOS and macOS (Xcode 15.3) [✓] Chrome - develop for the web [✓] Android Studio (version 2023.1) [✓] VS Code (version 1.87.2) [✓] Connected device (3 available) [✓] Network resources • No issues found! ```
knopp commented 1 month ago

Seems like a bug. How exactly do you scroll the list while holding a drag item?

LeoRc01 commented 1 month ago

Hi! Thank you for the attention @knopp !

I just use the mouse wheel!