动画小部件仅动画一次

时间:2017-03-03 23:20:10

标签: flutter

我有一个动画AnimatedText的小部件,在第一个动画之后,它似乎没有用setState重建。

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});
            }

AnimatedTest类:

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());
}

标题窗口小部件每次都重建,但带有AnimatedText的部分不会重建。 有关如何解决此问题的任何想法都会有所帮助

1 个答案:

答案 0 :(得分:1)

Widget上的字段应该是最终的。 State构造函数不应该参与。 您应该实现didUpdateConfig以从新Widget中获取数据以更新State的文本字段。