gpt4 book ai didi

flutter - 为什么 AnimationController 需要 vsync?

转载 作者:行者123 更新时间:2023-12-03 13:29:08 24 4
gpt4 key购买 nike

使用时 AnimationController ,那vsync的目的是什么?范围?

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?
);
}

// ...
}

最佳答案

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

通常有三种主要用途:

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

  • 最后一种情况是我们的小部件需要 SingleTickerProviderStateMixin 的主要原因。 .
    了解与动画关联的小部件很重要。我们不能只使用 TickerProvider从我们应用程序的根小部件获取。

    通过那个 vsync ,这将避免我们的小部件不再可见的情况(例如,如果另一条路线被推到它的顶部),但动画仍在播放,因此使我们的屏幕不断刷新

    查看该行为的一种方法是使用“性能覆盖”开发工具结合诸如 CircularProgressIndicator 之类的小部件。 ,内部使用 AnimationController .

    如果我们使用 Opacity隐藏我们的指标(不暂停动画):

    Opacity(
    opacity: 0,
    child: CircularProgressIndicator(),
    )

    然后性能叠加显示我们的屏幕不断刷新:

    opacity performance overlay

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

    Opacity(
    opacity: 0,
    child: TickerMode(
    enabled: false,
    child: CircularProgressIndicator(),
    ),
    ),

    muted

    关于flutter - 为什么 AnimationController 需要 vsync?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61040129/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com