Skip to content

Commit

Permalink
Merge pull request #87 from karvulf/bugfix/adding-removing-items-lead…
Browse files Browse the repository at this point in the history
…s-to-bugs

Bugfix/adding removing items leads to bugs
  • Loading branch information
karvulf committed Aug 21, 2023
2 parents 74de916 + 8b366a5 commit c27c314
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 28 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
## 5.0.0-dev.8
🐛 **Bug fixes**
* fixed animation when releasing a dragged item
* fixed item animations when adding or removing them

## 5.0.0-dev.7
⭐️ **New features**
Expand Down
9 changes: 7 additions & 2 deletions lib/controller/reorderable_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,13 @@ abstract class ReorderableController {

void handleCreatedChild({
required Offset? offset,
required Size? size,
required ReorderableEntity reorderableEntity,
}) {
if (offset != null) {
offsetMap[reorderableEntity.updatedOrderId] = offset;
}
final updatedEntity = reorderableEntity.creationFinished(
offset: offset,
size: size,
);
_updateMaps(reorderableEntity: updatedEntity);
}
Expand Down Expand Up @@ -106,6 +104,13 @@ abstract class ReorderableController {
}

void _updateMaps({required ReorderableEntity reorderableEntity}) {
// removes deprecated values in maps
childrenKeyMap.removeWhere(
(key, value) => value.updatedOrderId == reorderableEntity.updatedOrderId,
);
childrenOrderMap.removeWhere(
(key, value) => value.updatedOrderId == reorderableEntity.updatedOrderId,
);
childrenOrderMap[reorderableEntity.originalOrderId] = reorderableEntity;
childrenKeyMap[reorderableEntity.key.value] = reorderableEntity;
}
Expand Down
18 changes: 13 additions & 5 deletions lib/entities/reorderable_entity.dart
Original file line number Diff line number Diff line change
Expand Up @@ -85,17 +85,14 @@ class ReorderableEntity {
hasSwappedOrder: false,
);

ReorderableEntity creationFinished({
required Offset? offset,
required Size? size,
}) {
ReorderableEntity creationFinished({required Offset? offset}) {
return ReorderableEntity(
key: key,
originalOrderId: originalOrderId,
updatedOrderId: updatedOrderId,
originalOffset: originalOffset,
updatedOffset: offset ?? updatedOffset,
size: size ?? this.size,
size: size,
isBuildingOffset: false,
hasSwappedOrder: false, // todo false wirklich richtig?
);
Expand Down Expand Up @@ -154,5 +151,16 @@ class ReorderableEntity {
hasSwappedOrder: true,
);

ReorderableEntity copyWith({Size? size}) => ReorderableEntity(
key: key,
originalOrderId: originalOrderId,
updatedOrderId: updatedOrderId,
originalOffset: originalOffset,
updatedOffset: updatedOffset,
size: size ?? this.size,
isBuildingOffset: isBuildingOffset,
hasSwappedOrder: hasSwappedOrder,
);

bool get isNew => originalOrderId == _isNewChildId;
}
22 changes: 12 additions & 10 deletions lib/widgets/reorderable_animated_opcacity.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class _ReorderableAnimatedOpacityState
extends State<ReorderableAnimatedOpacity> {
/// Value that will be used for the opacity animation.
late double _opacity;
late final _globalKey = GlobalKey();

@override
void initState() {
Expand All @@ -55,6 +56,7 @@ class _ReorderableAnimatedOpacityState
@override
Widget build(BuildContext context) {
return AnimatedOpacity(
key: _globalKey,
opacity: _opacity,
duration: _duration,
onEnd: _handleAnimationFinished,
Expand All @@ -63,16 +65,16 @@ class _ReorderableAnimatedOpacityState
}

void _handleAnimationFinished() {
if (widget.reorderableEntity.isNew) {
// post frame delay is needed to ensure the widget was built
if (widget.fadeInDuration == Duration.zero) {
WidgetsBinding.instance.addPostFrameCallback((_) {
widget.onOpacityFinished(widget.reorderableEntity);
});
} else {
widget.onOpacityFinished(widget.reorderableEntity);
}
}
WidgetsBinding.instance.addPostFrameCallback((_) {
_callOnOpacityFinished();
});
}

void _callOnOpacityFinished() {
final renderObject = _globalKey.currentContext?.findRenderObject();
final renderBox = renderObject as RenderBox?;
final size = renderBox?.size;
widget.onOpacityFinished(widget.reorderableEntity.copyWith(size: size));
}

/// [Duration] used for the opacity animation.
Expand Down
20 changes: 10 additions & 10 deletions lib/widgets/reorderable_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -447,27 +447,27 @@ class _ReorderableBuilderState extends State<ReorderableBuilder>
final offsetMap = reorderableController.offsetMap;

Offset? offset;
Size? size;

var index = reorderableEntity.updatedOrderId;
final renderObject = key.currentContext?.findRenderObject();

if (renderObject != null && offsetMap[index] == null) {
// translating global offset to the local offset in this widget
if (renderObject != null) {
final renderBox = renderObject as RenderBox;
var parentRenderObject = context.findRenderObject() as RenderBox;
offset = parentRenderObject.globalToLocal(
renderBox.localToGlobal(Offset.zero),
);
offset += _getScrollOffset();

size = renderBox.size;
// should only add offset if it is not existing to prevent wrong animations
if (offsetMap[index] == null) {
// translating global offset to the local offset in this widget
var parentRenderObject = context.findRenderObject() as RenderBox;
offset = parentRenderObject.globalToLocal(
renderBox.localToGlobal(Offset.zero),
);
offset += _getScrollOffset();
}
}

reorderableController.handleCreatedChild(
offset: offset,
reorderableEntity: reorderableEntity,
size: size,
);
setState(() {});
}
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: flutter_reorderable_grid_view
description: Enables animated GridViews when updating children or when trying to reorder them by using drag and drop.
version: 5.0.0-dev.7
version: 5.0.0-dev.8
repository: https://github.com/karvulf/flutter-reorderable-grid-view

environment:
Expand Down

0 comments on commit c27c314

Please sign in to comment.