升级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
相关产品推荐
相关产品推荐

