Flutter 已设置动画的小部件仅设置一次动画
我有一个小部件,它有一个动画动画文本,在第一个动画之后,它似乎没有用setState重建Flutter 已设置动画的小部件仅设置一次动画,flutter,Flutter,我有一个小部件,它有一个动画动画文本,在第一个动画之后,它似乎没有用setState重建 Widget build(BuildContext context) { return createPage(texts[currentIndex]); } Widget createPage(Excerpt excerpt) { return new Material(child: new Stack( children: <Widget>[
Widget build(BuildContext context) {
return createPage(texts[currentIndex]);
}
Widget createPage(Excerpt excerpt) {
return new Material(child: new Stack(
children: <Widget>[
createBackgroundImage(excerpt),
new Column(mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
new Flexible(flex: 6, child: new SizedBox.expand()),
new Flexible(flex: 1,
child: createHeader(excerpt)),
new Flexible(flex: 4,
child: createTextBox(excerpt))
]),
]
));
}
Widget createTextBox(Excerpt excerpt) {
return new SizedBox.expand(child: new FlatButton(
color: Colors.black,
child: new Container(
padding: new EdgeInsets.only(top: 10.0),
constraints: new BoxConstraints.expand(),
child: new AnimatedText(excerpt.text)),
onPressed: () {
setState(() {//update index});
}
小部件构建(构建上下文){
返回createPage(文本[currentIndex]);
}
Widget createPage(摘录){
返回新材料(子项:新堆栈)(
儿童:[
createBackgroundImage(摘录),
新列(mainAxisAlignment:mainAxisAlignment.spaceBetween,
儿童:[
新的Flexible(flex:6,child:new-SizedBox.expand()),
新的柔性(柔性:1,
子项:createHeader(摘录)),
新的柔性(柔性:4,
子项:createTextBox(摘录))
]),
]
));
}
小部件createTextBox(摘录){
返回新的SizedBox.expand(子项:new FlatButton(
颜色:颜色,黑色,
子容器:新容器(
填充:仅限新边缘组(顶部:10.0),
约束:新建BoxConstraints.expand(),
子对象:新的动画文本(摘录.text)),
已按下:(){
setState((){//更新索引});
}
动画测试类:
class AnimatedText extends StatefulWidget {
String text;
AnimatedText(this.text);
@override
AnimatedTextState createState() => new AnimatedTextState(text);
}
class AnimatedTextState extends State<AnimatedText>
with SingleTickerProviderStateMixin {
String text;
String currentText = "";
AnimationController controller;
Animation animation;
AnimatedTextState(this.text){
print(text);
}
@override
void initState() {
super.initState();
controller = new AnimationController(
upperBound: text.length.toDouble(),
duration: new Duration(seconds: 3),
vsync: this);
controller.addListener((){
setState((){
currentText = text.substring(0,controller.value.round());
});
});
controller.forward();
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) =>
new Text(currentText, style: speakerStyle());
}
class AnimatedText扩展StatefulWidget{
字符串文本;
动画文本(this.text);
@凌驾
AnimatedTextState createState()=>新的AnimatedTextState(文本);
}
类AnimatedTextState扩展状态
使用SingleTickerProviderStateMixin{
字符串文本;
字符串currentText=“”;
动画控制器;
动画;
AnimatedTextState(this.text){
印刷品(文本);
}
@凌驾
void initState(){
super.initState();
控制器=新的AnimationController(
上限:text.length.toDouble(),
持续时间:新的持续时间(秒数:3),
vsync:这个);
controller.addListener(){
设置状态(){
currentText=text.substring(0,controller.value.round());
});
});
controller.forward();
}
@凌驾
无效处置(){
controller.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文)=>
新文本(当前文本,样式:speakerStyle());
}
header小部件每次都会重建,但带有动画文本的部分不会。
任何关于如何解决此问题的想法都会很有帮助小部件上的字段应为最终字段。 状态构造函数不应接受参数。
您应该实现didUpdateConfig,从新的小部件获取数据,以更新您的状态文本字段。我通过将动画控制器移动到父小部件并在索引从一页到另一页发生变化时控制动画来实现该功能。1.将小部件与TickerProviderStateMixin混合,2.创建动画控件当页面更改时,设置下一个控制器启动。