From 1eb38a855eea0f3cdabece728649c11289f586b9 Mon Sep 17 00:00:00 2001 From: karvulf <36191072+karvulf@users.noreply.github.com> Date: Wed, 24 May 2023 13:16:29 +0200 Subject: [PATCH 1/9] Update flutter_code_check.yml --- .github/workflows/flutter_code_check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 56c8ff42d2981fd0b0f110484066a3d744417afd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=B6rger?= Date: Mon, 28 Aug 2023 21:43:14 +0200 Subject: [PATCH 2/9] fixing dragging widget that is disposed --- lib/widgets/reorderable_builder.dart | 10 +++++++--- lib/widgets/reorderable_draggable.dart | 8 ++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/widgets/reorderable_builder.dart b/lib/widgets/reorderable_builder.dart index f7f59c6..25d5773 100644 --- a/lib/widgets/reorderable_builder.dart +++ b/lib/widgets/reorderable_builder.dart @@ -376,6 +376,10 @@ class _ReorderableBuilderState extends State ReorderableEntity reorderableEntity, Offset globalOffset, ) { + if(globalOffset == Offset(-999, -999)){ + _finishDragging(updateState: false); + return; + } var globalRenderObject = context.findRenderObject() as RenderBox; var offset = globalRenderObject.globalToLocal(globalOffset); @@ -393,14 +397,14 @@ class _ReorderableBuilderState extends State ); setState(() {}); - _finishDragging(); + _finishDragging(updateState: true); } void _handleScrollUpdate(Offset scrollOffset) { _reorderableController.scrollOffset = scrollOffset; } - void _finishDragging() { + void _finishDragging({required bool updateState}) { final draggedEntity = _reorderableController.draggedEntity; if (draggedEntity == null) return; @@ -416,7 +420,7 @@ class _ReorderableBuilderState extends State } // important to update the dragged entity which should be null at this point - setState(() {}); + if(updateState) setState(() {}); } /// Animation part diff --git a/lib/widgets/reorderable_draggable.dart b/lib/widgets/reorderable_draggable.dart index 13ef843..6c56994 100644 --- a/lib/widgets/reorderable_draggable.dart +++ b/lib/widgets/reorderable_draggable.dart @@ -80,6 +80,14 @@ class _ReorderableDraggableState extends State ); } + @override + void deactivate() { + if( widget.reorderableEntity.key == widget.currentDraggedEntity?.key) { + _handleDragEnd(const Offset(-999, -999)); + } + super.deactivate(); + } + @override void dispose() { _decoratedBoxAnimationController.dispose(); From 12f346e42af7092719129b8da4feed07900ac6a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=B6rger?= Date: Mon, 28 Aug 2023 21:43:26 +0200 Subject: [PATCH 3/9] main check --- example/lib/main.dart | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index 0994bbd..7df9214 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -22,12 +22,12 @@ class MyApp extends StatefulWidget { } class _MyAppState extends State { - static const _startCounter = 3333; - final lockedIndices = []; + static const _startCounter = 2; + final lockedIndices = [0]; int keyCounter = _startCounter; List children = List.generate(_startCounter, (index) => index); - ReorderableType reorderableType = ReorderableType.gridViewBuilder; + ReorderableType reorderableType = ReorderableType.gridViewExtent; var _scrollController = ScrollController(); var _gridViewKey = GlobalKey(); @@ -45,14 +45,14 @@ class _MyAppState extends State { onTapAddChild: () { setState(() { // children = children..add(keyCounter++); - children.insert(0, keyCounter++); + children.insert(1, keyCounter++); }); }, onTapRemoveChild: () { if (children.isNotEmpty) { setState(() { // children = children..removeLast(); - children.removeAt(0); + children.removeAt(2); }); } }, @@ -217,11 +217,33 @@ class _MyAppState extends State { List _getGeneratedChildren() { return List.generate( children.length, - (index) => _getChild(index: index), + (index) => _getChild(index: index), ); } Widget _getChild({required int index}) { + if (index == 0) { + return CustomDraggable( + key: Key(children[index].toString()), + data: index, + child: DragTarget( + onAccept: (v) { + setState(() { + children.removeAt(v as int); + }); + }, + builder: (context, candidateData, rejectedData) { + return Container( + height: 100.0, + width: 100.0, + child: Center( + child: Icon(Icons.delete), + ), + ); + }, + )); + } + return CustomDraggable( key: Key(children[index].toString()), data: index, From 1f6f22fec77fa70382ff63ec9d51b9b61e882db9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=B6rger?= Date: Mon, 28 Aug 2023 22:01:29 +0200 Subject: [PATCH 4/9] fixed issue when removing an item while dragging --- example/lib/main.dart | 2 +- lib/utils/definitions.dart | 6 +++++- lib/widgets/draggable_feedback.dart | 22 ++++++++++++++++++---- lib/widgets/reorderable_builder.dart | 6 +++--- lib/widgets/reorderable_draggable.dart | 15 +++++---------- 5 files changed, 32 insertions(+), 19 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index 7df9214..e82e4f7 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -22,7 +22,7 @@ class MyApp extends StatefulWidget { } class _MyAppState extends State { - static const _startCounter = 2; + static const _startCounter = 3; final lockedIndices = [0]; int keyCounter = _startCounter; diff --git a/lib/utils/definitions.dart b/lib/utils/definitions.dart index 97f8b84..44b78de 100644 --- a/lib/utils/definitions.dart +++ b/lib/utils/definitions.dart @@ -9,9 +9,13 @@ typedef ReorderableEntityCallback = void Function( typedef ReleasedReorderableEntityCallback = void Function( ReleasedReorderableEntity releasedReorderableEntity); +/// +/// +/// If [globalOffset] is null then [reorderableEntity] was removed before the +/// drag was finished. typedef OnDragEndFunction = void Function( ReorderableEntity reorderableEntity, - Offset globalOffset, + Offset? globalOffset, ); typedef OnCreatedFunction = void Function( diff --git a/lib/widgets/draggable_feedback.dart b/lib/widgets/draggable_feedback.dart index f485b9e..0c3837e 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 void Function(ReorderableEntity reorderableEntity) onDispose; const DraggableFeedback({ required this.child, required this.reorderableEntity, required this.decoration, + required this.onDispose, Key? key, }) : super(key: key); + @override + State createState() => _DraggableFeedbackState(); +} + +class _DraggableFeedbackState extends State { + @override + void deactivate() { + widget.onDispose(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 25d5773..f89dcb7 100644 --- a/lib/widgets/reorderable_builder.dart +++ b/lib/widgets/reorderable_builder.dart @@ -374,9 +374,9 @@ class _ReorderableBuilderState extends State /// has to be subtracted to get the correct position. void _handleDragEnd( ReorderableEntity reorderableEntity, - Offset globalOffset, + Offset? globalOffset, ) { - if(globalOffset == Offset(-999, -999)){ + if (globalOffset == null) { _finishDragging(updateState: false); return; } @@ -420,7 +420,7 @@ class _ReorderableBuilderState extends State } // important to update the dragged entity which should be null at this point - if(updateState) setState(() {}); + if (updateState) setState(() {}); } /// Animation part diff --git a/lib/widgets/reorderable_draggable.dart b/lib/widgets/reorderable_draggable.dart index 6c56994..8d4bf7e 100644 --- a/lib/widgets/reorderable_draggable.dart +++ b/lib/widgets/reorderable_draggable.dart @@ -80,14 +80,6 @@ class _ReorderableDraggableState extends State ); } - @override - void deactivate() { - if( widget.reorderableEntity.key == widget.currentDraggedEntity?.key) { - _handleDragEnd(const Offset(-999, -999)); - } - super.deactivate(); - } - @override void dispose() { _decoratedBoxAnimationController.dispose(); @@ -104,6 +96,9 @@ class _ReorderableDraggableState extends State decoration: _decorationTween.animate( _decoratedBoxAnimationController, ), + onDispose: (reorderableEntity) { + _handleDragEnd(null); + }, child: child, ); @@ -158,8 +153,8 @@ class _ReorderableDraggableState extends State /// /// Important: This can also be called after the widget was disposed but /// is still dragged. This has to be done to finish the drag and drop. - void _handleDragEnd(Offset offset) { - if (mounted) { + void _handleDragEnd(Offset? offset) { + if (mounted && offset != null) { _decoratedBoxAnimationController.reset(); } From 2a9fd3bc85de73d34c48d89cf2ea9a49fb1a4939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=B6rger?= Date: Fri, 1 Sep 2023 19:57:12 +0200 Subject: [PATCH 5/9] added drag canceled --- lib/utils/definitions.dart | 10 ++++++---- lib/widgets/reorderable_builder.dart | 24 ++++++++++++++---------- lib/widgets/reorderable_draggable.dart | 8 +++++--- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/lib/utils/definitions.dart b/lib/utils/definitions.dart index 44b78de..be08e20 100644 --- a/lib/utils/definitions.dart +++ b/lib/utils/definitions.dart @@ -10,12 +10,14 @@ typedef ReleasedReorderableEntityCallback = void Function( ReleasedReorderableEntity releasedReorderableEntity); /// -/// -/// If [globalOffset] is null then [reorderableEntity] was removed before the -/// drag was finished. typedef OnDragEndFunction = void Function( ReorderableEntity reorderableEntity, - Offset? globalOffset, + 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( diff --git a/lib/widgets/reorderable_builder.dart b/lib/widgets/reorderable_builder.dart index f89dcb7..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, ), ), @@ -374,12 +375,8 @@ class _ReorderableBuilderState extends State /// has to be subtracted to get the correct position. void _handleDragEnd( ReorderableEntity reorderableEntity, - Offset? globalOffset, + Offset globalOffset, ) { - if (globalOffset == null) { - _finishDragging(updateState: false); - return; - } var globalRenderObject = context.findRenderObject() as RenderBox; var offset = globalRenderObject.globalToLocal(globalOffset); @@ -397,14 +394,24 @@ class _ReorderableBuilderState extends State ); setState(() {}); - _finishDragging(updateState: true); + _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) { _reorderableController.scrollOffset = scrollOffset; } - void _finishDragging({required bool updateState}) { + void _finishDragging() { final draggedEntity = _reorderableController.draggedEntity; if (draggedEntity == null) return; @@ -418,9 +425,6 @@ class _ReorderableBuilderState extends State reorderUpdateEntities: reorderUpdateEntities, )); } - - // important to update the dragged entity which should be null at this point - if (updateState) setState(() {}); } /// Animation part diff --git a/lib/widgets/reorderable_draggable.dart b/lib/widgets/reorderable_draggable.dart index 8d4bf7e..100dfc7 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, @@ -97,7 +99,7 @@ class _ReorderableDraggableState extends State _decoratedBoxAnimationController, ), onDispose: (reorderableEntity) { - _handleDragEnd(null); + widget.onDragCanceled(reorderableEntity); }, child: child, ); @@ -153,8 +155,8 @@ class _ReorderableDraggableState extends State /// /// Important: This can also be called after the widget was disposed but /// is still dragged. This has to be done to finish the drag and drop. - void _handleDragEnd(Offset? offset) { - if (mounted && offset != null) { + void _handleDragEnd(Offset offset) { + if (mounted) { _decoratedBoxAnimationController.reset(); } From b705c7d5a6daaec80023cd69177a986d14429895 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=B6rger?= Date: Fri, 1 Sep 2023 20:10:32 +0200 Subject: [PATCH 6/9] renamed --- lib/widgets/reorderable_draggable.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/widgets/reorderable_draggable.dart b/lib/widgets/reorderable_draggable.dart index 100dfc7..65426ec 100644 --- a/lib/widgets/reorderable_draggable.dart +++ b/lib/widgets/reorderable_draggable.dart @@ -98,7 +98,7 @@ class _ReorderableDraggableState extends State decoration: _decorationTween.animate( _decoratedBoxAnimationController, ), - onDispose: (reorderableEntity) { + onDeactivate: (reorderableEntity) { widget.onDragCanceled(reorderableEntity); }, child: child, From 23e66cfa67a71b15bce3b51622f201b21f051d3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=B6rger?= Date: Fri, 1 Sep 2023 20:17:42 +0200 Subject: [PATCH 7/9] updated changelog --- CHANGELOG.md | 4 ++++ lib/widgets/draggable_feedback.dart | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) 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/widgets/draggable_feedback.dart b/lib/widgets/draggable_feedback.dart index 0c3837e..cb8763c 100644 --- a/lib/widgets/draggable_feedback.dart +++ b/lib/widgets/draggable_feedback.dart @@ -6,13 +6,13 @@ class DraggableFeedback extends StatefulWidget { final Widget child; final ReorderableEntity reorderableEntity; final Animation decoration; - final void Function(ReorderableEntity reorderableEntity) onDispose; + final ReorderableEntityCallback onDeactivate; const DraggableFeedback({ required this.child, required this.reorderableEntity, required this.decoration, - required this.onDispose, + required this.onDeactivate, Key? key, }) : super(key: key); @@ -23,7 +23,7 @@ class DraggableFeedback extends StatefulWidget { class _DraggableFeedbackState extends State { @override void deactivate() { - widget.onDispose(widget.reorderableEntity); + widget.onDeactivate(widget.reorderableEntity); super.deactivate(); } From 93866316675730afc9fa7515c9f1600a3139f54d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=B6rger?= Date: Fri, 1 Sep 2023 20:17:52 +0200 Subject: [PATCH 8/9] reverted main --- example/lib/main.dart | 32 +++++--------------------------- 1 file changed, 5 insertions(+), 27 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index e82e4f7..e25498c 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -22,12 +22,12 @@ class MyApp extends StatefulWidget { } class _MyAppState extends State { - static const _startCounter = 3; - final lockedIndices = [0]; + static const _startCounter = 3333; + final lockedIndices = []; int keyCounter = _startCounter; List children = List.generate(_startCounter, (index) => index); - ReorderableType reorderableType = ReorderableType.gridViewExtent; + ReorderableType reorderableType = ReorderableType.gridViewBuilder; var _scrollController = ScrollController(); var _gridViewKey = GlobalKey(); @@ -45,14 +45,14 @@ class _MyAppState extends State { onTapAddChild: () { setState(() { // children = children..add(keyCounter++); - children.insert(1, keyCounter++); + children.insert(0, keyCounter++); }); }, onTapRemoveChild: () { if (children.isNotEmpty) { setState(() { // children = children..removeLast(); - children.removeAt(2); + children.removeAt(0); }); } }, @@ -222,28 +222,6 @@ class _MyAppState extends State { } Widget _getChild({required int index}) { - if (index == 0) { - return CustomDraggable( - key: Key(children[index].toString()), - data: index, - child: DragTarget( - onAccept: (v) { - setState(() { - children.removeAt(v as int); - }); - }, - builder: (context, candidateData, rejectedData) { - return Container( - height: 100.0, - width: 100.0, - child: Center( - child: Icon(Icons.delete), - ), - ); - }, - )); - } - return CustomDraggable( key: Key(children[index].toString()), data: index, From 990bef31fe3a5be6d1c42acc36271ea300271c76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=B6rger?= Date: Fri, 1 Sep 2023 20:18:27 +0200 Subject: [PATCH 9/9] format --- example/lib/main.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index e25498c..0994bbd 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -217,7 +217,7 @@ class _MyAppState extends State { List _getGeneratedChildren() { return List.generate( children.length, - (index) => _getChild(index: index), + (index) => _getChild(index: index), ); }