collapsible
A widget that implicitly collapses and expands around its child by clipping it.
Usage
import 'package:collapsible/collapsible.dart';
Collapsible has three required parameters: child
, collapsed
, and axis
.
child
provides the widget Collapsible wraps, while collapsed
defines
the current state, whether its collapsed or not, and axis
specifies whether
the collapsing/expanding animation should transition horizontally, vertically,
or along both axes.
/// When updated to `false` the [Collapsible] will expand, revealing its
/// child, and will collapse, hiding the child if set back to `true`.
var _collapsed = true;
/// A [Collapsible] built with its default parameters.
Collapsible(
collapsed: _collapsed,
axis: CollapsibleAxis.both,
child: MyWidget(),
);
Alignment
Depending on the axis
of the transition and the Collapsible's placement
within its parent, you'll likely want to change the alignment
of the child
to match that of the Collapsible's alignment within its parent.
/// When collapsing vertically and the [Collapsible] is aligned to
/// the top edge of its parent, the [child] will look best if aligned
/// to the top-center of the [Collapsible].
Collapsible(
collapsed: _collapsed,
axis: CollapsibleAxis.vertical,
alignment: Alignment.topCenter,
child: MyWidget(),
);
Restricting the Size
The minimum width and height the Collapsible will collapse to can be provided
as factors that the child
's size will be multiplied by.
Specifying a minimum width/height factor can be a good idea if you want to
clip only a part of the child
or if you'd like the child to continue
occupying space within its parent when collapsed.
/// A [Collapsible] that collapses to 20% of the width and 40% of the
/// height of its child.
Collapsible(
collapsed: _collapsed,
axis: CollapsibleAxis.both,
minWidthFactor: 0.2,
minHeightFactor: 0.4,
child: MyWidget(),
);
Fading
Collapsible has a parameter, fade
, that if set to true
, will wrap the
child
with an AnimatedOpacity widget, which will fade the child in/out
as the Collapsible expands/collapses.
The minimum opacity the child
should fade to can be specified with the
minOpacity
parameter, which defaults to 0.0
(0%).
/// A [Collapsible] that fades its child in/out as it expands/collapses,
/// fading it out to 20% opacity.
Collapsible(
collapsed: _collapsed,
axis: CollapsibleAxis.horizontal,
fade: true,
minOpacity: 0.2,
child: MyWidget(),
);
Curve
An easing curve can be applied to the animation with the curve
parameter,
the curve will also be applied to the fading animation if fade
is true
.
curve
defaults to Curves.easeOut
.
/// A [Collapsible] whose animations start slowly then speed up.
Collapsible(
collapsed: _collapsed,
axis: CollapsibleAxis.both,
curve: Curves.easeIn,
fade: true,
child: MyWidget(),
);
Duration
The duration
of the animation can also be provided, which defaults to 240ms.
/// A [Collapsible] that takes 1 second to expand/collapse around its child.
Collapsible(
collapsed: _collapsed,
axis: CollapsibleAxis.both,
duration: Duration(seconds: 1),
child: MyWidget(),
);
Depending on the curve
you may want to provide a different duration
for the collapsing and expanding animations for a smoother appearance.
/// A [Collapsible] that takes 240ms to collapse and 360ms to expand.
Collapsible(
collapsed: _collapsed,
axis: CollapsibleAxis.both,
duration: Duration(milliseconds: _collapsed ? 240 : 360),
child: MyWidget(),
);
State Management
MaintainState
With the default settings, the Collapsible will replace the child
with
a SizedBox.shrink()
to free up the resources used by the child
. This
means every time the child
is revealed it will be built from a fresh state.
To prevent this, maintainState
can be set to true
, which will tell the
Collapsible to build the child
once and keep it built.
/// A [Collapsible] that maintains the state of its child when the
/// child is hidden.
Collapsible(
collapsed: _collapsed,
axis: CollapsibleAxis.both,
maintainState: true,
child: MyWidget(),
);
maintainState
will automatically be set to true
if the child
still
occupies any space when the Collapsible is in its collapsed space. This
occurs when minWidthFactor
or minHeightFactor
are greater than 0.0
and the transition occurs along the horizontal or vertical axes respectively.
MaintainAnimation
By default, the Collapsible will stop any of the childs', or its sub-trees',
animation tickers when in the collapsed state. maintainAnimation
can be
set to true
to keep them running.
/// A [Collapsible] that maintains the animations of its child when collapsed.
Collapsible(
collapsed: _collapsed,
axis: CollapsibleAxis.both,
maintainAnimation: true,
child: MyWidget(),
);
Setting maintainAnimation
to true
will automatically set maintainState
to true
, but unlike maintainState
, maintainAnimation
will remain
false
even if part of the child is still in view when collapsed, it must
be set to true
to keep the tickers active.
Libraries
- collapsible
- A widget that implicitly collapses and expands around its child by clipping it.