У меня есть список событий, которые мне нужно воспроизвести в пользовательском интерфейсе. Эти события представляют человека, отвечающего на вопрос. Таким образом, каждое событие представляет собой часть ответа, в данном случае это символ. Этот список взят из БД.
Я хочу показать это в анимационном стиле. Итак, я создавал следующее
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,
),
),
);
}
}