I am trying to animate two Rows of widgets to collapse into 1 Row of these widgets as one scrolls. I am trying to achieve this behavior inside a SliverAppBar
.
For clarification I have included a GIF here for reference. I would like the behavior you see in the app bar, but instead of 1 row to 2, i would like 2 row becoming 1.
https://media.giphy.com/media/2A4CP65QjamZC3K4c8/giphy.gif
Here is a quick snippet of what I have so far. I wrapped 2 Row
widgets that contain 3 shrinkableBox
widgets each into a Wrap
widget. I dynamically adjust the size of these boxes by hooking into _scrollController.offset
and doing some calculations. The rows do move around dynamically but they dont animate and move abruptly instead.
double kExpandedHeight = 300.0;
Widget build(BuildContext context) {
double size = !_scrollController.hasClients || _scrollController.offset == 0 ? 75.0 : 75 - math.min(45.0, (45 / kExpandedHeight * math.min(_scrollController.offset, kExpandedHeight) * 1.5));
return Scaffold(
body: CustomScrollView(
controller: _scrollController,
slivers: <Widget>[
SliverAppBar(
pinned: true,
expandedHeight: kExpandedHeight,
title: new Text(
"Title!",
),
bottom: PreferredSize(child: Wrap(
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
ShrinkableBox(
onClick: () {
print("tapped");
},
size: size,
),
ShrinkableBox(
onClick: () {
print("tapped");
},
size: size,
),
ShrinkableBox(
onClick: () {
print("tapped");
},
size: size,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
ShrinkableBox(
onClick: () {
print("tapped");
},
size: size,
),
ShrinkableBox(
onClick: () {
print("tapped");
},
size: size,
),
ShrinkableBox(
onClick: () {
print("tapped");
},
size: size,
),
],
),
],
), preferredSize: new Size.fromHeight(55),),
)...
...Other sliver list content here...
...