当使用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?
);
}
// ...
}发布于 2020-04-05 08:52:22
AnimationController的vsync参数有一个目的:基于外部因素控制动画的进度。
通常有三种主要用法:
vsync,这允许测试跳过帧以针对动画的非常特定的状态。这既精确又不涉及实时等待。最后一个场景是我们的小部件需要这个SingleTickerProviderStateMixin的主要原因。知道什么小部件与动画相关很重要。我们不能只使用从应用程序的根小部件中获得的TickerProvider。
通过该vsync,这将避免小部件不再可见的场景(例如,如果将另一条路径推到它的顶部),但是动画仍然在播放,因此使屏幕保持刷新。
查看这种行为的一种方法是使用"performance“devtool与诸如CircularProgressIndicator这样的小部件相结合,后者内部使用AnimationController。
如果使用Opacity隐藏指示符(不暂停动画):
Opacity(
opacity: 0,
child: CircularProgressIndicator(),
)然后,性能覆盖显示,我们的屏幕保持刷新:

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

https://stackoverflow.com/questions/61040129
复制相似问题