首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么AnimationController需要一个vsync?

为什么AnimationController需要一个vsync?
EN

Stack Overflow用户
提问于 2020-04-05 08:52:22
回答 1查看 1.6K关注 0票数 7

当使用AnimationController时,vsync参数的用途是什么?

代码语言:javascript
复制
class Example extends StatefulWidget {
  @override
  _ExampleState createState() => _ExampleState();
}

class _ExampleState extends State<Example> with SingleTickerProviderStateMixin {
  AnimationController controller;

  @override
  void initState() {
    super.initState();
    controller = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this, // Why do we need this?
    );
  }

  // ...
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-05 08:52:22

AnimationControllervsync参数有一个目的:基于外部因素控制动画的进度。

通常有三种主要用法:

  • devtools喜欢“慢动画”,它将AnimationControllers的速度降低了50%。
  • 小部件测试通过使用vsync,这允许测试跳过帧以针对动画的非常特定的状态。这既精确又不涉及实时等待。
  • 当与SingleTickerProviderStateMixin关联的小部件不可见时,它允许动画“静音”。

最后一个场景是我们的小部件需要这个SingleTickerProviderStateMixin的主要原因。知道什么小部件与动画相关很重要。我们不能只使用从应用程序的根小部件中获得的TickerProvider

通过该vsync,这将避免小部件不再可见的场景(例如,如果将另一条路径推到它的顶部),但是动画仍然在播放,因此使屏幕保持刷新。

查看这种行为的一种方法是使用"performance“devtool与诸如CircularProgressIndicator这样的小部件相结合,后者内部使用AnimationController

如果使用Opacity隐藏指示符(不暂停动画):

代码语言:javascript
复制
Opacity(
  opacity: 0,
  child: CircularProgressIndicator(),
)

然后,性能覆盖显示,我们的屏幕保持刷新:

现在,如果我们添加一个TickerMode (由可见性导航器等小部件隐式完成),我们可以暂停动画,从而停止不必要的刷新:

代码语言:javascript
复制
Opacity(
  opacity: 0,
  child: TickerMode(
    enabled: false,
    child: CircularProgressIndicator(),
  ),
),

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61040129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档