From 4a70bf89f648fd72de8be20eefdccaf2df3e5b8b Mon Sep 17 00:00:00 2001 From: Prajapati Het <87495246+Hetpra9653@users.noreply.github.com> Date: Mon, 18 Mar 2024 17:41:20 +0530 Subject: [PATCH] Fixed issue-21, dragging gridview widget background list was not updating. --- example/lib/main.dart | 5 +- example/lib/pages/grid_example.dart | 86 +++++++++-- .../lib/pages/grid_with_scrollcontroller.dart | 3 +- example/pubspec.lock | 8 +- example/pubspec.yaml | 2 +- lib/common/global_variables.dart | 18 +-- lib/flutter_draggable_gridview.dart | 88 +++++------ lib/widgets/drag_target_grid.dart | 141 ++++++------------ lib/widgets/long_press_draggable_grid.dart | 48 ++---- lib/widgets/placeholder_widget.dart | 1 - lib/widgets/press_draggable_grid.dart | 45 ++---- 11 files changed, 197 insertions(+), 248 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index 614b418..1033110 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,10 +1,9 @@ +import 'package:example/constants/colors.dart'; +import 'package:example/constants/strings.dart'; import 'package:example/pages/grid_example.dart'; import 'package:example/pages/grid_with_scrollcontroller.dart'; import 'package:flutter/material.dart'; -import 'constants/colors.dart'; -import 'constants/strings.dart'; - void main() { runApp(const MyApp()); } diff --git a/example/lib/pages/grid_example.dart b/example/lib/pages/grid_example.dart index 274afd4..ea40e16 100644 --- a/example/lib/pages/grid_example.dart +++ b/example/lib/pages/grid_example.dart @@ -1,6 +1,7 @@ import 'dart:developer'; import 'package:example/constants/images.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_draggable_gridview/flutter_draggable_gridview.dart'; @@ -17,10 +18,12 @@ class GridExample extends StatefulWidget { class GridExampleState extends State { final List _listOfDraggableGridItem = []; + final List _listOfDraggableGridItem2 = []; @override void initState() { - _generateImageData(); + _generateImageData1(); + _generateImageData2(); super.initState(); } @@ -29,20 +32,45 @@ class GridExampleState extends State { return Scaffold( appBar: AppBar( centerTitle: true, - title: Text(widget.title), + title: Text( + widget.title, + ), ), body: SafeArea( - child: DraggableGridViewBuilder( - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2, - childAspectRatio: MediaQuery.of(context).size.width / - (MediaQuery.of(context).size.height / 3), - ), - children: _listOfDraggableGridItem, - dragCompletion: onDragAccept, - isOnlyLongPress: false, - dragFeedback: feedback, - dragPlaceHolder: placeHolder, + child: Column( + children: [ + SizedBox( + height: MediaQuery.of(context).size.height / 3, + child: DraggableGridViewBuilder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + childAspectRatio: MediaQuery.of(context).size.width / + (MediaQuery.of(context).size.height / 3), + ), + children: _listOfDraggableGridItem, + dragCompletion: onDragAccept, + isOnlyLongPress: true, + dragFeedback: feedback, + dragPlaceHolder: placeHolder, + ), + ), + const SizedBox(height: 50), + SizedBox( + height: MediaQuery.of(context).size.height / 3, + child: DraggableGridViewBuilder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + childAspectRatio: MediaQuery.of(context).size.width / + (MediaQuery.of(context).size.height / 3), + ), + children: _listOfDraggableGridItem2, + dragCompletion: onDragAccept2, + isOnlyLongPress: true, + dragFeedback: feedback2, + dragPlaceHolder: placeHolder2, + ), + ), + ], ), ), ); @@ -69,7 +97,28 @@ class GridExampleState extends State { log('onDragAccept: $beforeIndex -> $afterIndex'); } - void _generateImageData() { + Widget feedback2(List list, int index) { + return SizedBox( + width: 200, + height: 150, + child: list[index].child, + ); + } + + PlaceHolderWidget placeHolder2(List list, int index) { + return PlaceHolderWidget( + child: Container( + color: Colors.green, + ), + ); + } + + void onDragAccept2( + List list, int beforeIndex, int afterIndex) { + log('onDragAccept: $beforeIndex -> $afterIndex'); + } + + void _generateImageData1() { _listOfDraggableGridItem.addAll( [ DraggableGridItem( @@ -85,8 +134,13 @@ class GridExampleState extends State { child: const GridItem(image: Images.asset_3), isDraggable: true), DraggableGridItem( child: const GridItem(image: Images.asset_4), isDraggable: true), - DraggableGridItem( - child: const GridItem(image: Images.asset_5), isDraggable: true), + ], + ); + } + + void _generateImageData2() { + _listOfDraggableGridItem2.addAll( + [ DraggableGridItem( child: const GridItem(image: Images.asset_6), isDraggable: true), DraggableGridItem( diff --git a/example/lib/pages/grid_with_scrollcontroller.dart b/example/lib/pages/grid_with_scrollcontroller.dart index 28c5f81..a528acf 100644 --- a/example/lib/pages/grid_with_scrollcontroller.dart +++ b/example/lib/pages/grid_with_scrollcontroller.dart @@ -43,6 +43,7 @@ class GridWithScrollControllerExampleState ), body: SafeArea( child: DraggableGridViewBuilder( + scrollDirection: Axis.vertical, controller: _scrollController, gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, @@ -97,7 +98,7 @@ class GridWithScrollControllerExampleState DraggableGridItem( child: const GridItem(image: Images.asset_4), isDraggable: true), DraggableGridItem( - child: const GridItem(image: Images.asset_5), isDraggable: true), + child: const GridItem(image: Images.asset_5), isDraggable: false), DraggableGridItem( child: const GridItem(image: Images.asset_6), isDraggable: true), DraggableGridItem( diff --git a/example/pubspec.lock b/example/pubspec.lock index 1f6abbe..1a52c1e 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -73,10 +73,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7 url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "3.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -110,10 +110,10 @@ packages: dependency: transitive description: name: lints - sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "3.0.0" matcher: dependency: transitive description: diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 60ef0c8..f28ac5f 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -23,7 +23,7 @@ dev_dependencies: # activated in the `analysis_options.yaml` file located at the root of your # package. See that file for information about deactivating specific lint # rules and activating additional ones. - flutter_lints: ^2.0.0 + flutter_lints: ^3.0.1 flutter: uses-material-design: true diff --git a/lib/common/global_variables.dart b/lib/common/global_variables.dart index 97ded56..941b20c 100644 --- a/lib/common/global_variables.dart +++ b/lib/common/global_variables.dart @@ -1,12 +1,10 @@ part of '../flutter_draggable_gridview.dart'; -// var dragStarted = false; -// var dragEnded = true; -// late List orgList; -// // late List _list; -// DraggableGridItem? draggedGridItem; -// // -// // /// [isOnlyLongPress] is Accepts 'true' and 'false' -// // /// If, it is true then only draggable works with long press. -// // /// and if it is false then it works with simple press. -// bool isOnlyLongPress = true; +bool _dragStarted = false; +bool _dragEnded = true; +DraggableGridItem? _draggedGridItem; + +// /// [isOnlyLongPress] is Accepts 'true' and 'false' +// /// If, it is true then only draggable works with long press. +// /// and if it is false then it works with simple press. +bool _isOnlyLongPress = true; diff --git a/lib/flutter_draggable_gridview.dart b/lib/flutter_draggable_gridview.dart index bbf9dbf..858bd3e 100644 --- a/lib/flutter_draggable_gridview.dart +++ b/lib/flutter_draggable_gridview.dart @@ -1,11 +1,8 @@ library draggable_grid_view; -import 'dart:developer'; - import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; - -import 'constants/colors.dart'; +import 'package:flutter_draggable_gridview/constants/colors.dart'; part 'common/global_variables.dart'; @@ -102,17 +99,19 @@ class DraggableGridViewBuilder extends StatefulWidget { } class DraggableGridViewBuilderState extends State { - bool _isOnlyLongPress = true; - late List _list; - DraggableGridItem? _draggedGridItem; late List _orgList; + late List _list; + + /// [isOnlyLongPress] is Accepts 'true' and 'false' + /// If, it is true then only draggable works with long press. + /// and if it is false then it works with simple press. @override void initState() { super.initState(); assert(widget.children.isNotEmpty, 'Children must not be empty.'); - /// [list] will update when the widget is being dragged. + /// [list] will update when the widget is begin dragged. _list = [...widget.children]; /// [orgList] will set when the drag completes. @@ -134,36 +133,30 @@ class DraggableGridViewBuilderState extends State { Widget build(BuildContext context) { if (widget.sliverMode) { return SliverGrid.builder( - itemCount: _list.length, - gridDelegate: widget.gridDelegate, - itemBuilder: (context, index) { - return (!_list[index].isDraggable) - ? _list[index].child - : DragTargetGrid( - index: index, - onChangeCallback: () => setState(() {}), - feedback: widget.dragFeedback?.call(_list, index), - childWhenDragging: - widget.dragChildWhenDragging?.call(_orgList, index), - placeHolder: widget.dragPlaceHolder?.call(_orgList, index), - dragCompletion: widget.dragCompletion, - list: _list, - draggedGridItem: _draggedGridItem, - onDragGridItem: (DraggableGridItem? data) { - _draggedGridItem = data; - setState(() {}); - }, - onOrgListUpdate: (List data) { - _orgList = data; - }, - onListUpdate: (List data) { - _list = data; - }, - orgList: _orgList, - isOnlyLongPress: _isOnlyLongPress, - ); - }, - ); + itemCount: _list.length, + gridDelegate: widget.gridDelegate, + itemBuilder: ((context, index) { + return (!_list[index].isDraggable) + ? _list[index].child + : DragTargetGrid( + isOnlyLongPress: _isOnlyLongPress, + list: _list, + orgList: _orgList, + index: index, + onChangeCallback: () => setState(() {}), + feedback: widget.dragFeedback?.call(_list, index), + childWhenDragging: + widget.dragChildWhenDragging?.call(_orgList, index), + placeHolder: widget.dragPlaceHolder?.call(_orgList, index), + dragCompletion: widget.dragCompletion, + onListUpdate: (List value) { + _list = value; + }, + onOrgListUpdate: (List value) { + _orgList = value; + }, + ); + })); } return GridView.builder( scrollDirection: widget.scrollDirection, @@ -186,6 +179,9 @@ class DraggableGridViewBuilderState extends State { return (!_list[index].isDraggable) ? _list[index].child : DragTargetGrid( + isOnlyLongPress: _isOnlyLongPress, + list: _list, + orgList: _orgList, index: index, onChangeCallback: () => setState(() {}), feedback: widget.dragFeedback?.call(_list, index), @@ -193,19 +189,11 @@ class DraggableGridViewBuilderState extends State { widget.dragChildWhenDragging?.call(_orgList, index), placeHolder: widget.dragPlaceHolder?.call(_orgList, index), dragCompletion: widget.dragCompletion, - isOnlyLongPress: _isOnlyLongPress, - list: _list, - orgList: _orgList, - draggedGridItem: _draggedGridItem, - onDragGridItem: (DraggableGridItem? data) { - _draggedGridItem = data; - setState(() {}); - }, - onOrgListUpdate: (List data) { - _orgList = data; + onListUpdate: (List value) { + _list = value; }, - onListUpdate: (List data) { - _list = data; + onOrgListUpdate: (List value) { + _orgList = value; }, ); }, diff --git a/lib/widgets/drag_target_grid.dart b/lib/widgets/drag_target_grid.dart index 17111b6..93f0324 100644 --- a/lib/widgets/drag_target_grid.dart +++ b/lib/widgets/drag_target_grid.dart @@ -1,6 +1,5 @@ part of '../flutter_draggable_gridview.dart'; -//ignore: must_be_immutable class DragTargetGrid extends StatefulWidget { final int index; final VoidCallback? onChangeCallback; @@ -8,30 +7,29 @@ class DragTargetGrid extends StatefulWidget { final Widget? childWhenDragging; final PlaceHolderWidget? placeHolder; final DragCompletion? dragCompletion; - final DraggableGridItem? draggedGridItem; - final Function(List) onListUpdate; - final Function(List) onOrgListUpdate; - final Function(DraggableGridItem?) onDragGridItem; + final ValueChanged> onListUpdate; + final ValueChanged> onOrgListUpdate; + final List orgList; + final List list; + /// [isOnlyLongPress] is Accepts 'true' and 'false' + /// If, it is true then only draggable works with long press. + /// and if it is false then it works with simple press. final bool isOnlyLongPress; - final List list; - late List orgList; - DragTargetGrid({ + const DragTargetGrid({ super.key, - required this.list, - required this.draggedGridItem, - required this.onDragGridItem, required this.index, - required this.orgList, - required this.onOrgListUpdate, - required this.onListUpdate, required this.onChangeCallback, this.feedback, this.childWhenDragging, this.placeHolder, - required this.isOnlyLongPress, required this.dragCompletion, + required this.orgList, + required this.list, + required this.isOnlyLongPress, + required this.onListUpdate, + required this.onOrgListUpdate, }); @override @@ -39,20 +37,26 @@ class DragTargetGrid extends StatefulWidget { } class DragTargetGridState extends State { + List? _orgList; + List? _list; static bool _draggedIndexRemoved = false; static int _lastIndex = -1; static int _draggedIndex = -1; - var _dragStarted = false; - var _dragEnded = true; - DraggableGridItem? _draggedGridItem; - late DragTargetDetails<(int, DraggableGridItem)> object; @override void initState() { - _draggedGridItem = widget.draggedGridItem; + _list = widget.list; + _orgList = widget.orgList; super.initState(); } + @override + void didUpdateWidget(DragTargetGrid oldWidget) { + _orgList = [...widget.orgList]; + + super.didUpdateWidget(oldWidget); + } + @override Widget build(BuildContext context) { return DragTarget<(int, DraggableGridItem)>( @@ -85,40 +89,18 @@ class DragTargetGridState extends State { /// [_isOnlyLongPress] is true then set the 'LongPressDraggableGridView' class or else set 'PressDraggableGridView' class. return (widget.isOnlyLongPress) ? LongPressDraggableGridView( + list: _list!, index: widget.index, feedback: widget.feedback, childWhenDragging: widget.childWhenDragging, onDragCancelled: () => _onDragComplete(_lastIndex), - dragEnded: _dragStarted, - dragStarted: _dragStarted, - onDragEnded: (bool data) { - _dragEnded = data; - setState(() {}); - }, - onDragStarted: (bool data) { - _dragStarted = data; - setState(() {}); - }, - list: widget.list, - draggedGridItem: _draggedGridItem, ) : PressDraggableGridView( + list: _list!, index: widget.index, feedback: widget.feedback, childWhenDragging: widget.childWhenDragging, onDragCancelled: () => _onDragComplete(_lastIndex), - dragStarted: _dragStarted, - dragEnded: _dragEnded, - onDragEnded: (bool data) { - _dragEnded = data; - setState(() {}); - }, - onDragStarted: (bool data) { - _dragStarted = data; - setState(() {}); - }, - list: widget.list, - draggedGridItem: _draggedGridItem, ); }, ); @@ -134,7 +116,6 @@ class DragTargetGridState extends State { _draggedGridItem = DraggableGridItem( child: widget.placeHolder ?? const EmptyItem(), isDraggable: true); _lastIndex = _draggedIndex; - widget.onDragGridItem.call(_draggedGridItem); } } @@ -143,9 +124,8 @@ class DragTargetGridState extends State { DragTargetDetails<(int, DraggableGridItem)> details, int index) { /// Here, check [_draggedIndex] is != -1. /// And also check index is not equal to _lastIndex. Means if both will true then skip it. else do some operations. - if (_draggedIndex != -1 && index != _lastIndex) { - widget.list.removeWhere((element) { + _list!.removeWhere((element) { return (widget.placeHolder != null) ? element.child is PlaceHolderWidget : element.child is EmptyItem; @@ -159,12 +139,11 @@ class DragTargetGridState extends State { /// For ex: /// If _draggedIndex is 6 and _lastIndex = 4 then _draggedChild will be 5. if (_draggedIndex > _lastIndex) { - _draggedGridItem = widget.orgList[_draggedIndex - 1]; + _draggedGridItem = _orgList?[_draggedIndex - 1]; } else { - _draggedGridItem = widget.orgList[ - (_draggedIndex + 1 >= widget.list.length) - ? _draggedIndex - : _draggedIndex + 1]; + _draggedGridItem = _orgList?[(_draggedIndex + 1 >= _list!.length) + ? _draggedIndex + : _draggedIndex + 1]; } /// If dragged index and current index both are same then show place holder widget(if user it overridden). else show EmptyItem class. @@ -175,69 +154,33 @@ class DragTargetGridState extends State { if (!_draggedIndexRemoved) { _draggedIndexRemoved = true; - widget.list.removeAt(_draggedIndex); + _list?.removeAt(_draggedIndex); } - widget.list.insert( + _list?.insert( _lastIndex, DraggableGridItem( child: widget.placeHolder ?? const EmptyItem(), isDraggable: true), ); } - widget.onDragGridItem.call(_draggedGridItem); - -// /// Here, check [_draggedIndex] is != -1. -// /// And also check index is not equal to _lastIndex. Means if both will true then skip it. else do some operations. -// if (_draggedIndex != -1 && index != _lastIndex) { -// widget.list.removeWhere((element) { -// return (widget.placeHolder != null) ? element.child is PlaceHolderWidget : element.child is EmptyItem; -// }); -// -// /// store _lastIndex as index. -// /// Means draggedIndex is 6 and dragged child is at index 4 then set _lastIndex to 4. -// _lastIndex = index; -// -// /// Here, we are checking _draggedIndex is greater than _lastIndex. -// /// For ex: -// /// If _draggedIndex is 6 and _lastIndex = 4 then _draggedChild will be 5. -// if (_draggedIndex > _lastIndex) { -// _draggedGridItem = widget.orgList[_draggedIndex - 1]; -// } else { -// _draggedGridItem = widget.orgList[(_draggedIndex + 1 >= widget.list.length) ? _draggedIndex : _draggedIndex + 1]; -// } -// -// /// If dragged index and current index both are same then show place holder widget(if user it overridden). else show EmptyItem class. -// if (_draggedIndex == _lastIndex) { -// _draggedGridItem = DraggableGridItem(child: widget.placeHolder ?? const EmptyItem(), isDraggable: true); -// } -// -// if (!_draggedIndexRemoved) { -// _draggedIndexRemoved = true; -// widget.list.removeAt(_draggedIndex); -// } -// widget.list.insert( -// _lastIndex, -// DraggableGridItem(child: widget.placeHolder ?? const EmptyItem(), isDraggable: true), -// ); -// } -// widget.onDragGridItem.call(_draggedGridItem); } /// This method will execute when dragging is completes or else dragging is cancelled. void _onDragComplete(int index) { if (_draggedIndex == -1) return; - widget.list.removeAt(index); - widget.list.insert(index, widget.orgList[_draggedIndex]); - widget.orgList = [...widget.list]; + _list?.removeAt(index); + _list?.insert(index, _orgList![_draggedIndex]); + + _orgList = _list!.toList(); _dragStarted = false; + widget.onListUpdate.call(_list!); + widget.onOrgListUpdate.call(_orgList!); widget.onChangeCallback?.call(); - widget.list[index].dragCallback?.call(context, false); - widget.dragCompletion?.call(widget.orgList, _draggedIndex, _lastIndex); + + widget.dragCompletion?.call(_orgList!, _draggedIndex, _lastIndex); + _draggedIndex = -1; _lastIndex = -1; _draggedGridItem = null; - widget.onDragGridItem.call(_draggedGridItem); - widget.onOrgListUpdate.call(widget.orgList); - widget.onListUpdate.call(widget.list); } } diff --git a/lib/widgets/long_press_draggable_grid.dart b/lib/widgets/long_press_draggable_grid.dart index 8ac35be..1b788c0 100644 --- a/lib/widgets/long_press_draggable_grid.dart +++ b/lib/widgets/long_press_draggable_grid.dart @@ -1,6 +1,5 @@ part of '../flutter_draggable_gridview.dart'; -//ignore: must_be_immutable class LongPressDraggableGridView extends StatelessWidget { /// [index] is use to get item from the list. final int index; @@ -10,56 +9,37 @@ class LongPressDraggableGridView extends StatelessWidget { /// [DragChildWhenDragging] this to display the widget at dragged widget place when the widget is being dragged. final Widget? childWhenDragging; - List list; final VoidCallback onDragCancelled; - bool dragStarted; - bool dragEnded; - Function(bool) onDragStarted; - Function(bool) onDragEnded; + final List list; - DraggableGridItem? draggedGridItem; - - LongPressDraggableGridView({ - required this.dragEnded, - required this.dragStarted, - required this.onDragEnded, - required this.onDragStarted, - required this.draggedGridItem, - required this.index, - required this.list, - required this.onDragCancelled, - this.feedback, - this.childWhenDragging, - super.key, - }); + const LongPressDraggableGridView( + {required this.index, + required this.onDragCancelled, + this.feedback, + this.childWhenDragging, + super.key, + required this.list}); @override Widget build(BuildContext context) { return LongPressDraggable<(int, DraggableGridItem)>( onDraggableCanceled: (_, __) => onDragCancelled(), - onDragCompleted: () { - log(''); - }, onDragStarted: () { - if (dragEnded) { - dragStarted = true; - dragEnded = false; - onDragStarted.call(true); - onDragEnded.call(false); + if (_dragEnded) { + _dragStarted = true; + _dragEnded = false; } }, onDragEnd: (details) { - dragEnded = true; - dragStarted = false; - onDragStarted.call(false); - onDragEnded.call(true); + _dragEnded = true; + _dragStarted = false; }, data: (index, list[index]), feedback: feedback ?? list[index].child, childWhenDragging: - childWhenDragging ?? draggedGridItem?.child ?? list[index].child, + childWhenDragging ?? _draggedGridItem?.child ?? list[index].child, child: list[index].child, ); } diff --git a/lib/widgets/placeholder_widget.dart b/lib/widgets/placeholder_widget.dart index 4a26893..bb10648 100644 --- a/lib/widgets/placeholder_widget.dart +++ b/lib/widgets/placeholder_widget.dart @@ -3,7 +3,6 @@ part of '../flutter_draggable_gridview.dart'; /// /// [PlaceHolderWidget] will use to show at drag target, when the widget is being dragged. class PlaceHolderWidget extends StatelessWidget { final Widget child; - const PlaceHolderWidget({required this.child, super.key}); @override diff --git a/lib/widgets/press_draggable_grid.dart b/lib/widgets/press_draggable_grid.dart index a6e7e70..9e4ee8f 100644 --- a/lib/widgets/press_draggable_grid.dart +++ b/lib/widgets/press_draggable_grid.dart @@ -1,53 +1,40 @@ part of '../flutter_draggable_gridview.dart'; -//ignore: must_be_immutable class PressDraggableGridView extends StatelessWidget { final int index; final Widget? feedback; final Widget? childWhenDragging; final VoidCallback onDragCancelled; - var dragStarted = false; - final Function(bool) onDragStarted; - final Function(bool) onDragEnded; - var dragEnded = true; - DraggableGridItem? draggedGridItem; - List list; - PressDraggableGridView( - {super.key, - required this.index, - required this.onDragCancelled, - this.feedback, - this.childWhenDragging, - required this.dragStarted, - required this.draggedGridItem, - required this.dragEnded, - required this.list, - required this.onDragEnded, - required this.onDragStarted}); + final List list; + + const PressDraggableGridView({ + super.key, + required this.index, + required this.onDragCancelled, + this.feedback, + this.childWhenDragging, + required this.list, + }); @override Widget build(BuildContext context) { return Draggable<(int, DraggableGridItem)>( onDraggableCanceled: (_, __) => onDragCancelled(), onDragStarted: () { - if (dragEnded) { - dragStarted = true; - dragEnded = false; - onDragEnded.call(false); - onDragStarted.call(true); + if (_dragEnded) { + _dragStarted = true; + _dragEnded = false; } }, onDragEnd: (details) { - dragEnded = true; - dragStarted = false; - onDragEnded.call(true); - onDragStarted.call(false); + _dragEnded = true; + _dragStarted = false; }, data: (index, list[index]), feedback: feedback ?? list[index].child, childWhenDragging: - childWhenDragging ?? draggedGridItem?.child ?? list[index].child, + childWhenDragging ?? _draggedGridItem?.child ?? list[index].child, child: list[index].child, ); }