flutter - 如何使用 setState 更改 ColorTween 开始或结束颜色
问题描述
这是我的测验应用程序的小部件。测验选项按钮。无论答案是真是假,我都希望它闪烁绿色或红色。但它不起作用。我尝试了不同的东西,但没有成功。请帮我。
import 'package:flutter/material.dart';
class TestButton extends StatefulWidget {
TestButton({this.text, this.color, this.onPressed});
final Function onPressed;
final Color color;
final String text;
@override
_TestButtonState createState() => _TestButtonState();
}
class _TestButtonState extends State<TestButton> with TickerProviderStateMixin {
AnimationController _animationController;
Animation _animation;
void initState() {
super.initState();
_animationController =
AnimationController(vsync: this, duration: Duration(milliseconds: 400));
_animation = ColorTween(begin: Colors.transparent, end: widget.color)
.animate(CurvedAnimation(curve: Curves.decelerate, parent: _animationController))
..addListener(() {
setState(() {
});
});
_animationController.addStatusListener((status) {
if (status == AnimationStatus.completed) {
_animationController.reverse();
} else if (status == AnimationStatus.dismissed) {
_animationController.forward();
}
});
_animationController.forward();
}
@override
void dispose() {
_animationController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
double width = MediaQuery.of(context).size.width;
return SizedBox(
width: width / 1.3,
child: InkWell(
borderRadius: BorderRadius.circular(30),
onTap: widget.onPressed,
child: Container(
child: Container(
alignment: Alignment.center,
padding: EdgeInsets.all(width / 20),
decoration: BoxDecoration(
color: _animation.value,
border: Border.all(color: Colors.white38),
borderRadius: BorderRadius.circular(20)),
child: Text(
widget.text,
style: TextStyle(fontSize: 16, fontFamily: "Fondamento"),
),
),
),
),
);
}
}
这就是按钮的用法。我正在应用 sesState,但它没有意义。问题是,动画工作但 setState 不影响 ColorTween 中的颜色值
TestButton(
text: question.optionA,
color: colorA,//Colors.transparent
onPressed: () {
if (canTap) {
canTap = false;
if (question.answer == 1) {
setState(() {
colorA = Colors.green;
});
} else {
setState(() {
colorA = Colors.red;
});
}
}
},
),
解决方案
删除这部分:
..addListener(() {
setState(() {
});
});
并像这样使用 AnimatedBuilder:
return SizedBox(
width: width / 1.3,
child: InkWell(
borderRadius: BorderRadius.circular(30),
onTap: widget.onPressed,
child: Container(
child: AnimatedBuilder(
animation: _animationController,
builder: (_, __) => Container(
alignment: Alignment.center,
padding: EdgeInsets.all(width / 20),
decoration: BoxDecoration(
color: _animationController.value,
border: Border.all(color: Colors.white38),
borderRadius: BorderRadius.circular(20)),
child: Text(
widget.text,
style: TextStyle(fontSize: 16, fontFamily: "Fondamento"),
),
)
),
),
),
);
推荐阅读
- c# - 从 .NET 解决方案中抓取网页(包括 AJAX)
- r - 如何创建关于机器学习模型的报表?
- php - 显示英文字符而不是阿拉伯语 - WordPress
- node.js - 用户订阅时发送电子邮件
- django - 赋值前引用的局部变量“password1”
- python - 将 2-d pandas 数据帧重新映射到 3-d xarray
- reactjs - 如何不在控制台中打印状态更改
- excel - 如何对动态的单个单元格求和?
- java - java.lang.NoClassDefFoundError: cucumber/api/DataTable error while rinning cucumber tests
- python - 如何在大型 csv 数据框中搜索特定的特征名称?