Skip to content

Commit

Permalink
feat: make AnimatableRenderObjectWidget work with InheritedWidgets (
Browse files Browse the repository at this point in the history
  • Loading branch information
blaugold committed May 23, 2023
1 parent fd94936 commit 677060d
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 13 deletions.
30 changes: 26 additions & 4 deletions packages/fleet/lib/src/animatable_flutter_widgets.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class AAlign extends Align

@override
_AlignAnimatableParameters createAnimatableParameters(
covariant RenderPositionedBox renderObject,
AnimatableParameterHost host,
) {
return (
Expand All @@ -43,7 +44,10 @@ class AAlign extends Align
}

@override
void updateAnimatableParameters(_AlignAnimatableParameters parameters) {
void updateAnimatableParameters(
BuildContext context,
_AlignAnimatableParameters parameters,
) {
parameters
..alignment.value = alignment
..widthFactor.value = widthFactor
Expand Down Expand Up @@ -242,13 +246,17 @@ class AOpacity extends Opacity

@override
_OpacityAnimatableParameters createAnimatableParameters(
covariant RenderOpacity renderObject,
AnimatableParameterHost host,
) {
return (opacity: AnimatableDouble(opacity, host: host));
}

@override
void updateAnimatableParameters(_OpacityAnimatableParameters parameters) {
void updateAnimatableParameters(
BuildContext context,
_OpacityAnimatableParameters parameters,
) {
parameters.opacity.value = opacity;
}

Expand Down Expand Up @@ -277,13 +285,17 @@ class APadding extends Padding

@override
_PaddingAnimatableParameters createAnimatableParameters(
covariant RenderPadding renderObject,
AnimatableParameterHost host,
) {
return (padding: AnimatableEdgeInsetsGeometry(padding, host: host),);
}

@override
void updateAnimatableParameters(_PaddingAnimatableParameters parameters) {
void updateAnimatableParameters(
BuildContext context,
_PaddingAnimatableParameters parameters,
) {
parameters.padding.value = padding;
}

Expand Down Expand Up @@ -543,6 +555,7 @@ class ASizedBox extends SizedBox

@override
_SizedBoxAnimatableParameters createAnimatableParameters(
covariant RenderConstrainedBox renderObject,
AnimatableParameterHost host,
) {
return (
Expand All @@ -554,7 +567,10 @@ class ASizedBox extends SizedBox
}

@override
void updateAnimatableParameters(_SizedBoxAnimatableParameters parameters) {
void updateAnimatableParameters(
BuildContext context,
_SizedBoxAnimatableParameters parameters,
) {
parameters.additionalConstraints.value = _additionalConstraints;
}

Expand Down Expand Up @@ -588,13 +604,15 @@ class ASliverOpacity extends SliverOpacity

@override
_SliverOpacityAnimatableParameters createAnimatableParameters(
covariant RenderSliverOpacity renderObject,
AnimatableParameterHost host,
) {
return (opacity: AnimatableDouble(opacity, host: host),);
}

@override
void updateAnimatableParameters(
BuildContext context,
_SliverOpacityAnimatableParameters parameters,
) {
parameters.opacity.value = opacity;
Expand Down Expand Up @@ -627,13 +645,15 @@ class ASliverPadding extends SliverPadding

@override
_SliverPaddingAnimatableParameters createAnimatableParameters(
covariant RenderSliverPadding renderObject,
AnimatableParameterHost host,
) {
return (padding: AnimatableEdgeInsetsGeometry(padding, host: host),);
}

@override
void updateAnimatableParameters(
BuildContext context,
_SliverPaddingAnimatableParameters parameters,
) {
parameters.padding.value = padding;
Expand Down Expand Up @@ -742,6 +762,7 @@ abstract class _TransformBase<T> extends ATransform

@override
_TransformAnimatableParameters<T> createAnimatableParameters(
covariant RenderTransform renderObject,
AnimatableParameterHost host,
) {
return (
Expand All @@ -753,6 +774,7 @@ abstract class _TransformBase<T> extends ATransform

@override
void updateAnimatableParameters(
BuildContext context,
_TransformAnimatableParameters<T> parameters,
) {
updateTransformInputParameters(parameters.transformInput);
Expand Down
39 changes: 30 additions & 9 deletions packages/fleet/lib/src/animatable_render_object_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,15 @@ abstract class AnimatableRenderObjectWidget<T extends Object>
const AnimatableRenderObjectWidget({super.key});

/// Creates the [AnimatableParameter]s for this widget.
T createAnimatableParameters(AnimatableParameterHost host);
T createAnimatableParameters(
covariant RenderObject renderObject,
AnimatableParameterHost host,
);

/// Updates the [AnimatableParameter]s with the new values.
///
/// This is called when the widget is rebuilt.
void updateAnimatableParameters(T parameters);
void updateAnimatableParameters(BuildContext context, T parameters);

/// Updates the [RenderObject] with the current
/// [AnimatableParameter.animatedValue]s.
Expand All @@ -45,22 +48,32 @@ mixin _AnimatableRenderObjectElementMixin<T extends Object>
void update(covariant RenderObjectWidget newWidget) {
if (_animatableParameters == null) {
if (Transaction.of(this) != null) {
_animatableParameters = widget.createAnimatableParameters(this);
_animatableParameters =
widget.createAnimatableParameters(renderObject, this);
}
}

super.update(newWidget);

final animatableParameters = _animatableParameters;
if (animatableParameters != null) {
applyUpdateToAnimatableParameters();
_updateRenderObjectWithAnimatableParameters();
}
// TODO: It's inefficient to do this now, after the render object has
// already been updated by updateRenderObject. But there currently is no
// other way to do this.
_applyUpdateToAnimatableParameters();
}

@override
void performRebuild() {
super.performRebuild();

// TODO: It's inefficient to do this now, after the render object has
// already been updated by updateRenderObject. But there currently is no
// other way to do this.
_applyUpdateToAnimatableParameters();
}

@override
void updateAnimatableParameters() {
widget.updateAnimatableParameters(_animatableParameters!);
widget.updateAnimatableParameters(this, _animatableParameters!);
}

@override
Expand All @@ -87,6 +100,14 @@ mixin _AnimatableRenderObjectElementMixin<T extends Object>
_animatableParameters!,
);
}

void _applyUpdateToAnimatableParameters() {
final animatableParameters = _animatableParameters;
if (animatableParameters != null) {
applyUpdateToAnimatableParameters();
_updateRenderObjectWithAnimatableParameters();
}
}
}

/// A mixin that allows a [SingleChildRenderObjectWidget] to transparently
Expand Down

0 comments on commit 677060d

Please sign in to comment.