Skip to content

Commit

Permalink
feat: add widgets for padding and opacity (#21)
Browse files Browse the repository at this point in the history
  • Loading branch information
blaugold committed Sep 3, 2022
1 parent e0300e0 commit c389a65
Show file tree
Hide file tree
Showing 5 changed files with 181 additions and 5 deletions.
10 changes: 7 additions & 3 deletions packages/fleet/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,9 @@ All we did was replace `ColoredBox` with [`AColoredBox`][acoloredbox] and use
[`setStateWithAnimation`][setstatewithanimation] instead of `setState`.

The `AColoredBox` widget is a drop-in replacement for `ColoredBox` that supports
**state-based animation**. Any widget you want to animate through Fleet needs to
support state-based animation. These widgets don't have any special parameters
related to animation and can be just as well used without animation.
animating with Fleet. Widgets that support animating with Fleet don't have any
special parameters related to animation and can be used without animation, just
as well.

Fleet provides drop-in replacements for a number of generally useful Flutter
framework widgets (all with the prefix `A`). Any widget can be made to support
Expand Down Expand Up @@ -157,7 +157,11 @@ for animating with Fleet:
- AAlign
- AColoredBox
- AContainer
- AOpacity
- APadding
- ASizedBox
- ASliverOpacity
- ASliverPadding

---

Expand Down
10 changes: 9 additions & 1 deletion packages/fleet/lib/fleet.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
export 'src/animatable_flutter_widgets.dart'
show AAlign, AColoredBox, AContainer, ASizedBox;
show
AAlign,
AColoredBox,
AContainer,
AOpacity,
APadding,
ASizedBox,
ASliverOpacity,
ASliverPadding;
export 'src/animatable_widget.dart'
show
AnimatableAlignmentGeometry,
Expand Down
160 changes: 160 additions & 0 deletions packages/fleet/lib/src/animatable_flutter_widgets.dart
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,86 @@ class _AContainerState extends AnimatableState<AContainer> {
}
}

/// Animatable version of [Opacity].
///
/// {@category Animatable Flutter widget}
class AOpacity extends StatefulWidget {
/// Creates an animatable version of [Opacity].
const AOpacity({
super.key,
required this.opacity,
this.alwaysIncludeSemantics = false,
this.child,
});

/// See [Opacity.opacity].
final double opacity;

/// See [Opacity.alwaysIncludeSemantics].
final bool alwaysIncludeSemantics;

/// See [ProxyWidget.child].
final Widget? child;

@override
State<AOpacity> createState() => _AOpacityState();
}

class _AOpacityState extends AnimatableState<AOpacity> {
late final _opacity = AnimatableDouble(widget.opacity, state: this);

@override
void updateAnimatableParameters() {
_opacity.value = widget.opacity;
}

@override
Widget build(BuildContext context) {
return Opacity(
opacity: _opacity.animatedValue,
alwaysIncludeSemantics: widget.alwaysIncludeSemantics,
child: widget.child,
);
}
}

/// Animatable version of [Padding].
///
/// {@category Animatable Flutter widget}
class APadding extends StatefulWidget {
/// Creates an animatable version of [Padding].
const APadding({super.key, required this.padding, this.child});

/// See [Padding.padding].
final EdgeInsetsGeometry padding;

/// See [ProxyWidget.child].
final Widget? child;

@override
State<APadding> createState() => _APaddingState();
}

class _APaddingState extends AnimatableState<APadding> {
late final _padding = AnimatableEdgeInsetsGeometry(
widget.padding,
state: this,
);

@override
void updateAnimatableParameters() {
_padding.value = widget.padding;
}

@override
Widget build(BuildContext context) {
return Padding(
padding: _padding.animatedValue,
child: widget.child,
);
}
}

/// Animatable version of [SizedBox].
///
/// {@category Animatable Flutter widget}
Expand Down Expand Up @@ -282,3 +362,83 @@ class _ASizedBoxState extends AnimatableState<ASizedBox> {
);
}
}

/// Animatable version of [SliverOpacity].
///
/// {@category Animatable Flutter widget}
class ASliverOpacity extends StatefulWidget {
/// Creates an animatable version of [SliverOpacity].
const ASliverOpacity({
super.key,
required this.opacity,
this.alwaysIncludeSemantics = false,
this.sliver,
});

/// See [SliverOpacity.opacity].
final double opacity;

/// See [SliverOpacity.alwaysIncludeSemantics].
final bool alwaysIncludeSemantics;

/// See [ProxyWidget.child].
final Widget? sliver;

@override
State<ASliverOpacity> createState() => _ASliverOpacityState();
}

class _ASliverOpacityState extends AnimatableState<ASliverOpacity> {
late final _opacity = AnimatableDouble(widget.opacity, state: this);

@override
void updateAnimatableParameters() {
_opacity.value = widget.opacity;
}

@override
Widget build(BuildContext context) {
return SliverOpacity(
opacity: _opacity.animatedValue,
alwaysIncludeSemantics: widget.alwaysIncludeSemantics,
sliver: widget.sliver,
);
}
}

/// Animatable version of [SliverPadding].
///
/// {@category Animatable Flutter widget}
class ASliverPadding extends StatefulWidget {
/// Creates an animatable version of [SliverPadding].
const ASliverPadding({super.key, required this.padding, this.sliver});

/// See [SliverPadding.padding].
final EdgeInsetsGeometry padding;

/// See [ProxyWidget.child].
final Widget? sliver;

@override
State<ASliverPadding> createState() => _ASliverPaddingState();
}

class _ASliverPaddingState extends AnimatableState<ASliverPadding> {
late final _padding = AnimatableEdgeInsetsGeometry(
widget.padding,
state: this,
);

@override
void updateAnimatableParameters() {
_padding.value = widget.padding;
}

@override
Widget build(BuildContext context) {
return SliverPadding(
padding: _padding.animatedValue,
sliver: widget.sliver,
);
}
}
4 changes: 4 additions & 0 deletions packages/fleet/lib/src/animate.dart
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,11 @@ extension SetStateWithAnimationExtension on State {
/// - [AAlign]
/// - [AColoredBox]
/// - [AContainer]
/// - [AOpacity]
/// - [APadding]
/// - [ASizedBox]
/// - [ASliverOpacity]
/// - [ASliverPadding]
///
/// {@endtemplate}
///
Expand Down
2 changes: 1 addition & 1 deletion packages/fleet/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: fleet
description:
An animation Framework for Flutter. It is state-based, declarative,
extensible, composable and aims to be user-friendly.
extensible, composable and easy to use.
version: 0.1.1
issue_tracker: https://github.com/blaugold/fleet/issues
homepage: https://github.com/blaugold/fleet/tree/main/packages/fleet
Expand Down

0 comments on commit c389a65

Please sign in to comment.