了解flutter中SingleTickerProviderStateMixin的使用

SingleTickerProviderStateMixin是Flutter中一个常用的mixin,用于为需要单个Ticker(时钟)的State对象提供Ticker支持。Ticker是用于动画的计时器,它在每一帧调用一个回调函数,使动画得以进行。使用SingleTickerProviderStateMixin可以让State对象成为一个TickerProvider,从而创建和管理AnimationController。

基本概念

关于mixin,可以参考我的这篇文章

在 Flutter 中,Ticker 是一个计时器,它会在每一帧调用一个回调函数。Ticker 通常用于动画中,用来驱动 AnimationController。

SingleTickerProviderStateMixin和TickerProviderStateMixin是Flutter中用于管理动画控制器的两个mixin,它们的主要区别在于它们能管理的Ticker的数量。

SingleTickerProviderStateMixin

SingleTickerProviderStateMixin适用于需要单个Ticker的动画场景。Ticker是一个时钟,每一帧都会调用一个回调函数,使动画得以进行。

适用场景

  • 当你只需要一个AnimationController时使用。
  • 简单动画场景,比如淡入淡出、旋转等简单动画效果。

TickerProviderStateMixin

TickerProviderStateMixin适用于需要多个Ticker的动画场景。它允许一个State对象管理多个AnimationController。

适用场景

  • 当你需要多个AnimationController时使用。
  • 复杂动画场景,比如同时管理多个动画效果的情况下。

通过控制AnimationController,可以实现动画的播放、暂停、停止、倒放等操作。例如,在用户点击按钮时播放动画。

scala 复制代码
dart
复制代码
class ControlAnimation extends StatefulWidget {
  @override
  _ControlAnimationState createState() => _ControlAnimationState();
}

class _ControlAnimationState extends State<ControlAnimation> with SingleTickerProviderStateMixin {
  late AnimationController _controller;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  void _startAnimation() {
    _controller.forward();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Control Animation Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ScaleTransition(
              scale: _controller,
              child: FlutterLogo(
                size: 100.0,
              ),
            ),
            SizedBox(height: 20.0),
            ElevatedButton(
              onPressed: _startAnimation,
              child: Text('Start Animation'),
            ),
          ],
        ),
      ),
    );
  }
}

代码解释

  • 混入SingleTickerProviderStateMixin :通过混入SingleTickerProviderStateMixin,_MyHomePageState类就变成了一个TickerProvider,可以为动画控制器提供Ticker。
  • 初始化AnimationController :在initState方法中初始化AnimationController,并指定动画持续时间和vsync(即TickerProvider)。
  • 处理控制器的生命周期 :在dispose方法中销毁控制器以释放资源。
  • 使用AnimationController :在build方法中使用AnimationController,这里使用了一个FadeTransition来实现一个淡入淡出的动画效果。

工作原理

由SingleTickerProviderStateMixin的源码就可以知道,

  1. 实现 TickerProvider 接口 :SingleTickerProviderStateMixin 实现了 TickerProvider 接口,这意味着它可以为 AnimationController 提供 Ticker。
  2. 创建 Ticker :当 AnimationController 初始化时,它会调用 TickerProvider 的 createTicker 方法来创建一个 Ticker。
  3. 管理 Ticker 的生命周期 :SingleTickerProviderStateMixin 会在 State 对象的 dispose 方法中销毁 Ticker,确保不会发生内存泄漏。

TickerProviderStateMixin的源码区别在于内部维护了一个ticker集合,用于集中管理多个ticker。

相关推荐
传奇开心果编程7 分钟前
【现代声明式UI学与练】第4课 列表渲染与 key——如何高效渲染列表、key 的作用、列表重排时的状态保持
学习·flutter·react native·ui·swiftui·android jetpack
m0_738185823 小时前
Flutter 鸿蒙化实战:media_info 适配 OpenHarmony,媒体信息与缩略图
flutter·华为·harmonyos·鸿蒙·媒体
m0_738185824 小时前
Flutter 鸿蒙化实战:just_audio 适配 OpenHarmony,功能强大的播放器
flutter·华为·harmonyos·鸿蒙
传奇开心果编程16 小时前
【现代声明式UI学与练】第7课 组件通信——父传子、子传父、跨层级通信、状态提升与 Context
学习·flutter·react native·ui·swiftui·android jetpack
律宏阔18 小时前
Flutter 列表图片内存优化:CachedNetworkImage 与 ClipRRect 的取舍
前端·flutter
律宏阔18 小时前
Dart 3 Record:解决 Future.wait 异构返回值的类型问题
前端·flutter
伯伯熊勞20 小时前
GetX 巢狀路由教學:用三層 Navigator 做桌面多欄佈局
flutter
传奇开心果编程1 天前
【现代声明式UI学与练】第9课 性能优化——渲染优化、列表优化、内存优化、启动优化
学习·flutter·react native·ui·性能优化·swiftui·android jetpack
m0_738185821 天前
Flutter 鸿蒙化实战:foundation_fluttify 适配 OpenHarmony,Fluttify 桥接层
flutter·华为·harmonyos·鸿蒙
m0_738185821 天前
Flutter 鸿蒙化实战:http_proxy 适配 OpenHarmony,HTTP 代理
flutter·http·华为·harmonyos·鸿蒙