【发布时间】:2019-08-16 02:13:28
【问题描述】:
我有一个具有正常/动画状态的自定义小部件。有时我希望它是动画的,有时是静态的。
我做了一个简单的测试项目来演示我的问题:测试页面包含我的自定义小部件 (ScoreBoard) 和 2 个按钮来开始/停止动画记分板。我的问题是,即使我开始动画,记分板也没有动画。
这是我的代码:
TestPage:
class TestPage extends StatefulWidget {
@override
_TestPageState createState() => _TestPageState();
}
class _TestPageState extends State<TestPage> {
bool _animate;
@override
void initState() {
_animate = false;
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
ScoreBoard(
text: "Hello, world!",
animate: _animate,
),
FlatButton(
child: Text("START animation"),
onPressed: () {
setState(() {
_animate = true;
});
},
),
FlatButton(
child: Text("STOP animation"),
onPressed: () {
setState(() {
_animate = false;
});
},
),
],
),
);
}
}
记分板小部件:
class ScoreBoard extends StatefulWidget {
final String text;
final bool animate;
const ScoreBoard({Key key, this.text, this.animate}) : super(key: key);
@override
_ScoreBoardState createState() => _ScoreBoardState();
}
class _ScoreBoardState extends State<ScoreBoard>
with SingleTickerProviderStateMixin {
AnimationController _controller;
@override
void initState() {
super.initState();
_controller = new AnimationController(
duration: const Duration(seconds: 1),
vsync: this,
)..forward();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return widget.animate
? ScaleTransition(
child:
Text(widget.text, style: Theme.of(context).textTheme.display1),
scale: new CurvedAnimation(
parent: _controller,
curve: Curves.easeIn,
),
)
: Container(
child:
Text(widget.text, style: Theme.of(context).textTheme.display1),
);
}
}
你愿意帮我吗?提前致谢!
【问题讨论】:
-
只有当你初始化你的状态时你的控制器是
forward()ed -
我应该把它转发到哪里?
-
你应该这样做来触发你的
ScaleTransition -
谢谢,很多,我的意思是用哪种方法以及如何?