SliverAppBar 中的动画 => 动态调整栏大小

问题描述 投票:0回答:2

我得到了一个

SliverAppBar
,里面有一个
AnimatedContainer
。此动画容器的高度在运行时发生变化,因此容器会以动画方式调整其大小。我的问题是,我的 SliverAppBar 的
expandedHeight
已修复。但这需要调整模拟容器的大小以适应我的动画容器。

有没有办法将 SliverAppBar 设置为“高度始终根据孩子”或类似的东西? AnimatedContainer 没有回调,它在调整大小时为我提供所有更改。如果有这样的回调,我可以自己相应地更改 SliverAppBar 的

expandedHeight
属性。

知道如何解决我的问题吗?谢谢!

return SliverAppBar(
      elevation: 0,
      snap: true,
      pinned: false,
      floating: true,
      forceElevated: false,
      primary: false,
      automaticallyImplyLeading: false,
      backgroundColor: Colors.white,
      expandedHeight: _eHeight,
      flexibleSpace: Column(children: <Widget>[
        AnimatedContainer(
            onEnd: onTopBarsAnimationEnd,
            height: _trending
                ? _tabBarHeight: _tabBarHeight + topicsHeight,
            duration: Duration(milliseconds: 800),
            curve: Curves.fastOutSlowIn,
            child: // some child
            )
        ]
    )
)
            

编辑 - 这是一个 gif,显示了我想要实现的目标:

flutter flutter-layout flutter-sliver
2个回答
4
投票

如果你检查AnimatedContainer文档,他们会说:

此类对于通过其内部 AnimationController 在不同参数之间生成简单的隐式转换非常有用。对于更复杂的动画,您可能需要使用 AnimatedWidget 的子类,例如 DecoratedBoxTransition 或使用您自己的 AnimationController。

这里,“隐式”意味着您不会控制动画,因此您将无法访问允许您监听动画步骤的 AnimationController 类。为此,您将需要类似 AnimatedWidget 的东西。

深入研究 AnimationController 发现它继承自 ImplicitlyAnimatedWidget,文档说:

ImplicitlyAnimatedWidgets(及其子类)会在其属性发生变化时自动以动画方式进行更改。为此,他们创建并管理自己的“内部动画控制器”来为动画提供动力。虽然这些小部件使用起来很简单,并且不需要您手动管理 AnimationController 的生命周期,但它们也有一些限制:除了动画属性的目标值之外,开发人员只能选择动画的持续时间和曲线。如果您需要对动画进行更多控制(例如,您想在中间的某个位置停止动画),请考虑使用 AnimatedWidget 或其子类之一。这些小部件采用动画作为参数来驱动动画。这使开发人员可以完全控制动画,但需要您手动管理底层动画控制器。

因此,您需要创建 AnimatedController 对象并将其传递给 AnimatedWidget。您可以在
docs

中查看示例。 最后,要在每个动画步骤中执行某些操作,您需要使用其方法

addListener

将侦听器函数添加到 AnimatedController,这通常是在小部件的 initState 方法中完成的。


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.