Значение анимации IntTween повторяется во флаттере. Можем ли мы иметь неповторяющиеся значения? - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть список событий, которые мне нужно воспроизвести в пользовательском интерфейсе. Эти события представляют человека, отвечающего на вопрос. Таким образом, каждое событие представляет собой часть ответа, в данном случае это символ. Этот список взят из БД.

Я хочу показать это в анимационном стиле. Итак, я создавал следующее

1) AnimationController, у которого есть продолжительность = 100 * replayEvents.length (таким образом, каждое событие получает идею 100 мс) 2) IntTween, который имеет начало 0 и конец replayEvents.length (так что я думаю, что я получу инкрементное значение каждые 100 мс, а затем я могу использовать это значение для запроса списка и отображения следующего символа)

Однако похоже, что animation.value в IntTween повторяется, как 1, повторяется и т. Д. Как я могу сделать это неповторяющимся значением. Смотрите полный код ниже.

Спасибо.

class AnswerWidget extends StatefulWidget {

  List<dynamic> answerList; // comes from DB parent widget sends to this widget

  AnswerWidget({this.answerList});

  @override
  State<StatefulWidget> createState() => AnswerWidgetState();

}

class AnswerWidgetState extends State<AnswerWidget> with SingleTickerProviderStateMixin {

  int _noOfAnswerLetters = 6; // hard coding for now

  Animation<int> _animation;
  AnimationController _controller;

  List<String> localAnswerList = new List();

  @override
  void initState() {
    super.initState();

    _controller = AnimationController(vsync: this,
        duration: Duration(milliseconds: (100 * widget.answerList.length)));

    _animation = IntTween(begin: 0, end: widget.answerList.length-1).animate(_controller);

    _animation.addListener(() {

      if(widget.answerList[_animation.value]["mode"] == ANSWER_MODE.ANSWER.toString()) {
        setState(() {
          this.localAnswerList.add(widget.answerList[_animation.value]["letter"]);
        });
      }

    });

    _controller.forward();

  }

  @override
  void dispose() {
    super.dispose();
    _controller?.dispose();
  }

  @override
  Widget build(BuildContext context) {

    List<Widget> answerWidgets = new List();
    for(int i=0; i<_noOfAnswerLetters; i++) {
      if(localAnswerList.length > i)
        answerWidgets.add( AnswerBox(answerLetter: localAnswerList[i], borderColor: ColorConstants.normalBorderColor,) );
      else
        answerWidgets.add( AnswerBox(answerLetter: "", borderColor: ColorConstants.normalBorderColor,) );
    }

    return Container(
      height: 64.0,
      decoration: BoxDecoration(
        border: Border.all(width: 1.5, color: ColorConstants.normalBorderColor),
        color: ColorConstants.normalColor,
      ),
      child: Padding(
        padding: const EdgeInsets.only(top:8.0, bottom: 8.0, left: 6.0),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: answerWidgets,
        ),
      ),
    );
  }

}
...