【发布时间】:2019-07-30 02:28:05
【问题描述】:
我正在尝试为两行小部件设置动画,以作为一个滚动折叠成这些小部件的 1 行。我试图在SliverAppBar 中实现这种行为。
为澄清起见,我在此处包含了一个 GIF 以供参考。我想要您在应用栏中看到的行为,但我希望 2 行变成 1,而不是 1 行到 2 行。
这是我目前所拥有的快速快照。我将 2 个包含 3 个 shrinkableBox 小部件的 Row 小部件包装成一个 Wrap 小部件。我通过连接_scrollController.offset 并进行一些计算来动态调整这些框的大小。这些行确实会动态移动,但它们不会设置动画并且会突然移动。
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...
// ...
【问题讨论】:
标签: user-interface animation flutter