diff --git a/.github/workflows/flutter_code_check.yml b/.github/workflows/flutter_code_check.yml index 0865daf..05523a1 100644 --- a/.github/workflows/flutter_code_check.yml +++ b/.github/workflows/flutter_code_check.yml @@ -31,7 +31,7 @@ jobs: # Uncomment this step to verify the use of 'flutter format' on each commit. - name: Verify formatting - run: flutter format --output=none --set-exit-if-changed . + run: dart format --output=none --set-exit-if-changed . # Consider passing '--fatal-infos' for slightly stricter analysis. - name: Analyze project source diff --git a/CHANGELOG.md b/CHANGELOG.md index 78ff35d..7f2dd3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 5.0.0-dev.9 +🐛 **Bug fixes** +* fixed issue when deleting the dragged child (thanks to `khjde1207` - Issue [#88](https://github.com/karvulf/flutter-reorderable-grid-view/issues/88)) + ## 5.0.0-dev.8 🐛 **Bug fixes** * fixed animation when releasing a dragged item diff --git a/lib/utils/definitions.dart b/lib/utils/definitions.dart index 97f8b84..be08e20 100644 --- a/lib/utils/definitions.dart +++ b/lib/utils/definitions.dart @@ -9,11 +9,17 @@ typedef ReorderableEntityCallback = void Function( typedef ReleasedReorderableEntityCallback = void Function( ReleasedReorderableEntity releasedReorderableEntity); +/// typedef OnDragEndFunction = void Function( ReorderableEntity reorderableEntity, Offset globalOffset, ); +/// Called if drag was canceled, e.g. the dragged item is removed while dragging. +typedef OnDragCanceledFunction = void Function( + ReorderableEntity reorderableEntity, +); + typedef OnCreatedFunction = void Function( ReorderableEntity reorderableEntity, GlobalKey key, diff --git a/lib/widgets/draggable_feedback.dart b/lib/widgets/draggable_feedback.dart index f485b9e..cb8763c 100644 --- a/lib/widgets/draggable_feedback.dart +++ b/lib/widgets/draggable_feedback.dart @@ -1,21 +1,35 @@ import 'package:flutter/material.dart'; import 'package:flutter_reorderable_grid_view/entities/reorderable_entity.dart'; +import 'package:flutter_reorderable_grid_view/utils/definitions.dart'; -class DraggableFeedback extends StatelessWidget { +class DraggableFeedback extends StatefulWidget { final Widget child; final ReorderableEntity reorderableEntity; final Animation decoration; + final ReorderableEntityCallback onDeactivate; const DraggableFeedback({ required this.child, required this.reorderableEntity, required this.decoration, + required this.onDeactivate, Key? key, }) : super(key: key); + @override + State createState() => _DraggableFeedbackState(); +} + +class _DraggableFeedbackState extends State { + @override + void deactivate() { + widget.onDeactivate(widget.reorderableEntity); + super.deactivate(); + } + @override Widget build(BuildContext context) { - final size = reorderableEntity.size; + final size = widget.reorderableEntity.size; return Material( color: Colors.transparent, // removes white corners when having shadow @@ -24,8 +38,8 @@ class DraggableFeedback extends StatelessWidget { width: size.width, child: DecoratedBoxTransition( position: DecorationPosition.background, - decoration: decoration, - child: child, + decoration: widget.decoration, + child: widget.child, ), ), ); diff --git a/lib/widgets/reorderable_builder.dart b/lib/widgets/reorderable_builder.dart index f7f59c6..e5dcd46 100644 --- a/lib/widgets/reorderable_builder.dart +++ b/lib/widgets/reorderable_builder.dart @@ -327,6 +327,7 @@ class _ReorderableBuilderState extends State dragChildBoxDecoration: widget.dragChildBoxDecoration, onDragStarted: _handleDragStarted, onDragEnd: _handleDragEnd, + onDragCanceled: _handleDragCanceled, child: child, ), ), @@ -394,6 +395,16 @@ class _ReorderableBuilderState extends State setState(() {}); _finishDragging(); + + // important to update the dragged entity which should be null at this point + setState(() {}); + } + + /// Called after the dragged child was canceled, e.g. deleted. + /// + /// Finishes dragging without doing any animation for the dragged entity. + void _handleDragCanceled(ReorderableEntity reorderableEntity) { + _finishDragging(); } void _handleScrollUpdate(Offset scrollOffset) { @@ -414,9 +425,6 @@ class _ReorderableBuilderState extends State reorderUpdateEntities: reorderUpdateEntities, )); } - - // important to update the dragged entity which should be null at this point - setState(() {}); } /// Animation part diff --git a/lib/widgets/reorderable_draggable.dart b/lib/widgets/reorderable_draggable.dart index 13ef843..65426ec 100644 --- a/lib/widgets/reorderable_draggable.dart +++ b/lib/widgets/reorderable_draggable.dart @@ -23,6 +23,7 @@ class ReorderableDraggable extends StatefulWidget { final ReorderableEntityCallback onDragStarted; final OnDragEndFunction onDragEnd; + final OnDragCanceledFunction onDragCanceled; final ReorderableEntity? currentDraggedEntity; @@ -34,6 +35,7 @@ class ReorderableDraggable extends StatefulWidget { required this.enableDraggable, required this.onDragStarted, required this.onDragEnd, + required this.onDragCanceled, required this.currentDraggedEntity, this.dragChildBoxDecoration, Key? key, @@ -96,6 +98,9 @@ class _ReorderableDraggableState extends State decoration: _decorationTween.animate( _decoratedBoxAnimationController, ), + onDeactivate: (reorderableEntity) { + widget.onDragCanceled(reorderableEntity); + }, child: child, );