Skip to content

Commit

Permalink
Merge pull request #156 from karvulf/155-about-drag-to-empty-area
Browse files Browse the repository at this point in the history
155 about drag to empty area
  • Loading branch information
karvulf authored Feb 14, 2025
2 parents 62cb14e + b953ff9 commit 31304eb
Show file tree
Hide file tree
Showing 21 changed files with 284 additions and 108 deletions.
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,17 @@
- updated the default value of `automaticScrollExtent` to `150.0` (was `80.0` before)
- updated `README` to explain when to use a `ScrollController` (related to the issue ([#152](https://github.com/karvulf/flutter-reorderable-grid-view/issues/152)))
- some code refactoring
- added a new parameter `onReorderedPositions`
- this callback is similar to `onReorder`
- but in this case you can handle the reorder logic by yourself
- thanks to `FaFre` for the PR ([#153](https://github.com/karvulf/flutter-reorderable-grid-view/pull/153))

🐛 **Bug Fixes**
- `Reorderable.builder` had an issue when removing children and starting drag and drop
- the issue happened because the reorder was started with items out of the index
- this is fixed by adding a new parameter `itemCount` to `ReorderableBuilder.builder`
- this value is required to ensure that only the children which are rendered by the widget will used also for reordering
- thanks to `yoyoNTNU` for finding the issue ([#155](https://github.com/karvulf/flutter-reorderable-grid-view/issues/155))

## 5.4.1
🐛 **Bug Fixes**
Expand Down
1 change: 1 addition & 0 deletions example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,7 @@ class _MyAppState extends State<MyApp> {
onUpdatedDraggedChild: _handleUpdatedDraggedChild,
onDragEnd: _handleDragEnd,
scrollController: _scrollController,
itemCount: children.length,
childBuilder: (itemBuilder) {
return GridView.builder(
key: _gridViewKey,
Expand Down
1 change: 1 addition & 0 deletions example/lib/other_examples/drag_target_example.dart
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ class _MyAppState extends State<MyApp> {
children = reorderedListFunction(children);
});
},
itemCount: children.length,
childBuilder: (itemBuilder) {
return GridView.builder(
key: _gridViewKey,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class _MyAppState extends State<MyApp> {
_children = reorderedListFunction(_children);
});
},
itemCount: _children.length,
childBuilder: (itemBuilder) {
return GridView.builder(
key: _gridViewKey,
Expand Down
1 change: 1 addition & 0 deletions example/lib/other_examples/page_view_example.dart
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ class _RecorderableItemState extends State<RecorderableItem> {
onUpdatedDraggedChild: _handleUpdatedDraggedChild,
onDragEnd: _handleDragEnd,
scrollController: _scrollController,
itemCount: children.length,
childBuilder: (itemBuilder) {
return GridView.builder(
key: _gridViewKey,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class _MyAppState extends State<MyApp> {
children = reorderedListFunction(children);
});
},
itemCount: children.length,
childBuilder: (itemBuilder) {
return GridView.builder(
key: _gridViewKey,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class _MyAppState extends State<MyApp> {
children = reorderedListFunction(children);
});
},
itemCount: children.length,
childBuilder: (itemBuilder) {
return GridView.builder(
key: _gridViewKey,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ class _MyAppState extends State<MyApp> {
});
},
reverse: reverse,
itemCount: children.length,
childBuilder: (itemBuilder) {
return GridView.builder(
key: _gridViewKey,
Expand Down
92 changes: 46 additions & 46 deletions example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -5,42 +5,42 @@ packages:
dependency: transitive
description:
name: async
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
url: "https://pub.dev"
source: hosted
version: "2.11.0"
version: "2.12.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
version: "2.1.2"
characters:
dependency: transitive
description:
name: characters
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
url: "https://pub.dev"
source: hosted
version: "1.3.0"
version: "1.4.0"
clock:
dependency: transitive
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev"
source: hosted
version: "1.1.1"
version: "1.1.2"
collection:
dependency: transitive
description:
name: collection
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
url: "https://pub.dev"
source: hosted
version: "1.18.0"
version: "1.19.1"
cupertino_icons:
dependency: "direct main"
description:
Expand All @@ -53,18 +53,18 @@ packages:
dependency: transitive
description:
name: fake_async
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
url: "https://pub.dev"
source: hosted
version: "1.3.1"
version: "1.3.2"
file:
dependency: transitive
description:
name: file
sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
url: "https://pub.dev"
source: hosted
version: "7.0.0"
version: "7.0.1"
flutter:
dependency: "direct main"
description: flutter
Expand Down Expand Up @@ -109,18 +109,18 @@ packages:
dependency: transitive
description:
name: leak_tracker
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
url: "https://pub.dev"
source: hosted
version: "10.0.5"
version: "10.0.8"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
url: "https://pub.dev"
source: hosted
version: "3.0.5"
version: "3.0.9"
leak_tracker_testing:
dependency: transitive
description:
Expand All @@ -141,10 +141,10 @@ packages:
dependency: transitive
description:
name: matcher
sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
url: "https://pub.dev"
source: hosted
version: "0.12.16+1"
version: "0.12.17"
material_color_utilities:
dependency: transitive
description:
Expand All @@ -157,71 +157,71 @@ packages:
dependency: transitive
description:
name: meta
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
url: "https://pub.dev"
source: hosted
version: "1.15.0"
version: "1.16.0"
path:
dependency: transitive
description:
name: path
sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
url: "https://pub.dev"
source: hosted
version: "1.9.0"
version: "1.9.1"
platform:
dependency: transitive
description:
name: platform
sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65"
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
url: "https://pub.dev"
source: hosted
version: "3.1.5"
version: "3.1.6"
process:
dependency: transitive
description:
name: process
sha256: "21e54fd2faf1b5bdd5102afd25012184a6793927648ea81eea80552ac9405b32"
sha256: "107d8be718f120bbba9dcd1e95e3bd325b1b4a4f07db64154635ba03f2567a0d"
url: "https://pub.dev"
source: hosted
version: "5.0.2"
version: "5.0.3"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.99"
version: "0.0.0"
source_span:
dependency: transitive
description:
name: source_span
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
url: "https://pub.dev"
source: hosted
version: "1.10.0"
version: "1.10.1"
stack_trace:
dependency: transitive
description:
name: stack_trace
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
url: "https://pub.dev"
source: hosted
version: "1.11.1"
version: "1.12.1"
stream_channel:
dependency: transitive
description:
name: stream_channel
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
version: "2.1.4"
string_scanner:
dependency: transitive
description:
name: string_scanner
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
url: "https://pub.dev"
source: hosted
version: "1.2.0"
version: "1.4.1"
sync_http:
dependency: transitive
description:
Expand All @@ -234,18 +234,18 @@ packages:
dependency: transitive
description:
name: term_glyph
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
url: "https://pub.dev"
source: hosted
version: "1.2.1"
version: "1.2.2"
test_api:
dependency: transitive
description:
name: test_api
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
url: "https://pub.dev"
source: hosted
version: "0.7.2"
version: "0.7.4"
vector_math:
dependency: transitive
description:
Expand All @@ -258,18 +258,18 @@ packages:
dependency: transitive
description:
name: vm_service
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
url: "https://pub.dev"
source: hosted
version: "14.2.5"
version: "14.3.1"
webdriver:
dependency: transitive
description:
name: webdriver
sha256: "003d7da9519e1e5f329422b36c4dcdf18d7d2978d1ba099ea4e45ba490ed845e"
sha256: "3d773670966f02a646319410766d3b5e1037efb7f07cc68f844d5e06cd4d61c8"
url: "https://pub.dev"
source: hosted
version: "3.0.3"
version: "3.0.4"
sdks:
dart: ">=3.3.1 <4.0.0"
dart: ">=3.7.0-0 <4.0.0"
flutter: ">=3.18.0-18.0.pre.54"
7 changes: 7 additions & 0 deletions lib/controller/reorderable_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,13 @@ abstract class ReorderableController {
return updatedEntity;
}

/// Removes all children that have a higher position the [itemCount].
void shortenMapsToItemCount({required int itemCount}) {
childrenKeyMap.removeWhere(
(key, value) => value.originalOrderId >= itemCount,
);
}

/// Resets all entities in [childrenOrderMap] and [childrenKeyMap].
///
/// Clears [offsetMap] and rebuilds all entities in [childrenOrderMap] and
Expand Down
2 changes: 2 additions & 0 deletions lib/controller/reorderable_drag_and_drop_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,15 @@ class ReorderableDragAndDropController extends ReorderableController {
required Offset currentScrollOffset,
required List<int> lockedIndices,
required bool isScrollableOutside,
required int? itemCount,
}) {
_releasedReorderableEntity = null;
this.lockedIndices = lockedIndices;
super.draggedEntity = childrenKeyMap[reorderableEntity.key.value];
scrollOffset = currentScrollOffset;
this.isScrollableOutside = isScrollableOutside;
startDraggingScrollOffset = currentScrollOffset;
if (itemCount != null) super.shortenMapsToItemCount(itemCount: itemCount);
}

bool handleDragUpdate({required PointerMoveEvent pointerMoveEvent}) {
Expand Down
Loading

0 comments on commit 31304eb

Please sign in to comment.