You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Flutter版本后AnimatedRotation不可用,咨询可行替代方案

Flutter AnimatedRotation 不可用替代方案

方案1:使用AnimatedContainer(最简实现,无需额外控制器)

直接替换原有代码即可,实现效果和AnimatedRotation完全一致:

import 'dart:math';

// 原有AnimatedRotation写法参考
// AnimatedRotation(
//   turns: _rotateTurns, // 旋转圈数,1对应360度
//   duration: Duration(milliseconds: 300),
//   curve: Curves.easeInOut,
//   child: MyWidget(),
// )

// 替代写法
AnimatedContainer(
  duration: const Duration(milliseconds: 300),
  curve: Curves.easeInOut,
  transform: Matrix4.rotationZ(_rotateTurns * 2 * pi), // 圈数转弧度计算
  alignment: Alignment.center, // 与AnimatedRotation默认对齐规则一致
  child: MyWidget(),
)

方案2:使用RotationTransition(适配动画精细控制需求)

如果需要手动控制动画启停、监听动画状态,选择该方案:

// State类中定义控制器与动画对象
late AnimationController _animationController;
late Animation<double> _turnsAnim;

@override
void initState() {
  super.initState();
  _animationController = AnimationController(
    vsync: this,
    duration: const Duration(milliseconds: 300),
  );
  _turnsAnim = Tween<double>(begin: 0, end: 1).animate(
    CurvedAnimation(parent: _animationController, curve: Curves.easeInOut),
  );
}

// 布局中使用
RotationTransition(
  turns: _turnsAnim,
  child: MyWidget(),
)

// 触发动画执行
// _animationController.forward(); // 正向播放
// _animationController.reverse(); // 反向回退
// _animationController.reset(); // 重置动画状态

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

方案3:自定义封装同名组件(无缝兼容旧代码)

如果不想修改原有业务逻辑的调用代码,直接封装同名组件全局替换即可:

import 'dart:math';
import 'package:flutter/widgets.dart';

class AnimatedRotation extends ImplicitlyAnimatedWidget {
  const AnimatedRotation({
    super.key,
    required this.turns,
    required super.duration,
    super.curve,
    this.child,
    this.alignment = Alignment.center,
  });

  final double turns;
  final Widget? child;
  final Alignment alignment;

  @override
  AnimatedWidgetBaseState<AnimatedRotation> createState() => _AnimatedRotationState();
}

class _AnimatedRotationState extends AnimatedWidgetBaseState<AnimatedRotation> {
  Tween<double>? _turnsTween;

  @override
  void forEachTween(TweenVisitor<dynamic> visitor) {
    _turnsTween = visitor(
      _turnsTween,
      widget.turns,
      (dynamic value) => Tween<double>(begin: value as double),
    ) as Tween<double>;
  }

  @override
  Widget build(BuildContext context) {
    return Transform.rotate(
      angle: _turnsTween!.evaluate(animation) * 2 * pi,
      alignment: widget.alignment,
      child: widget.child,
    );
  }
}

内容的提问来源于stack exchange,提问作者Goggi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 05:51:02