12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- import 'package:flutter/material.dart';
- /// 由 [TweenAnimationBuilder] 改造的组件,区别在于这个会重复动画。
- class RepeatTweenAnimationBuilder<T extends Object?> extends ImplicitlyAnimatedWidget {
- const RepeatTweenAnimationBuilder({
- super.key,
- required this.tween,
- required super.duration,
- super.curve,
- required this.builder,
- super.onEnd,
- this.child,
- });
- final Tween<T> tween;
- final ValueWidgetBuilder<T> builder;
- final Widget? child;
- @override
- ImplicitlyAnimatedWidgetState<ImplicitlyAnimatedWidget> createState() {
- return _TweenAnimationBuilderState<T>();
- }
- }
- class _TweenAnimationBuilderState<T extends Object?> extends AnimatedWidgetBaseState<RepeatTweenAnimationBuilder<T>> {
- Tween<T>? _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<dynamic> 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<T>?;
- }
- @override
- Widget build(BuildContext context) {
- return widget.builder(context, _currentTween!.evaluate(animation), widget.child);
- }
- }
|