import 'package:flutter/material.dart'; /// 由 [TweenAnimationBuilder] 改造的组件,区别在于这个会重复动画。 class RepeatTweenAnimationBuilder extends ImplicitlyAnimatedWidget { const RepeatTweenAnimationBuilder({ super.key, required this.tween, required super.duration, super.curve, required this.builder, super.onEnd, this.child, }); final Tween tween; final ValueWidgetBuilder builder; final Widget? child; @override ImplicitlyAnimatedWidgetState createState() { return _TweenAnimationBuilderState(); } } class _TweenAnimationBuilderState extends AnimatedWidgetBaseState> { Tween? _currentTween; @override void initState() { _currentTween = widget.tween; _currentTween!.begin ??= _currentTween!.end; super.initState(); if (_currentTween!.begin != _currentTween!.end) { // 使用 repeat 来重复绘制动画。 controller.repeat(reverse: true); } } @override void forEachTween(TweenVisitor visitor) { assert( widget.tween.end != null, 'Tween provided to TweenAnimationBuilder must have non-null Tween.end value.', ); _currentTween = visitor(_currentTween, widget.tween.end, (dynamic value) { assert(false); throw StateError('Constructor will never be called because null is never provided as current tween.'); }) as Tween?; } @override Widget build(BuildContext context) { return widget.builder(context, _currentTween!.evaluate(animation), widget.child); } }