我通过分离颜色补间对象的动画对象解决了我的问题
void redraw(Color beginColor, Color endColor) {
setState(() {
_colorTween = ColorTween(begin: beginColor, end: endColor);
_colorTweenAnimation = _colorTween.animate(_animationController);
});
}
全班:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
class FingerprintImageWidget extends StatefulWidget {
FingerprintImageWidget(
{Key key, this.width, this.height, this.beginColor, this.endColor})
: super(key: key);
final double width;
final double height;
Color beginColor;
Color endColor;
@override
FingerprintImageWidgetState createState() => FingerprintImageWidgetState();
}
class FingerprintImageWidgetState extends State<FingerprintImageWidget>
with SingleTickerProviderStateMixin {
AnimationController _animationController;
ColorTween _colorTween;
Animation<Color> _colorTweenAnimation;
Color beginColor;
Color endColor;
@override
void initState() {
beginColor = widget.beginColor;
endColor = widget.endColor;
_animationController =
AnimationController(vsync: this, duration: const Duration(seconds: 1));
_colorTween = ColorTween(begin: beginColor, end: endColor);
_colorTweenAnimation = _colorTween.animate(_animationController);
changeColors();
super.initState();
}
void redraw(Color beginColor, Color endColor) {
setState(() {
_colorTween = ColorTween(begin: beginColor, end: endColor);
_colorTweenAnimation = _colorTween.animate(_animationController);
});
}
Future<void> changeColorController;
@override
void dispose() {
_animationController.dispose();
disposed = true;
super.dispose();
}
bool disposed = false;
Future<void> changeColors() async {
while (!disposed) {
if (disposed) return;
await Future<void>.delayed(const Duration(milliseconds: 1300), () {
if (_animationController.status == AnimationStatus.completed) {
_animationController.reverse();
} else {
_animationController.forward();
}
});
}
}
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: _colorTweenAnimation,
builder: (BuildContext context, Widget child) => AppImage(
IMAGE_FINGERPRINT,
width: widget.width,
height: widget.height,
color: _colorTweenAnimation.value,
fit: BoxFit.contain,
));
}
}
然后我使用了全局键,这样我就可以调用重绘
final GlobalKey<FingerprintImageWidgetState> _fingerprintImageKey =
GlobalKey();
FingerprintImageWidget(
key: _fingerprintImageKey,
width: 70,
height: 100,
beginColor: beginFingerColor,
endColor: endFingerColor,
),
_fingerprintImageKey.currentState.redraw(beginFingerColor,endFingerColor);