Как изменить продолжительность анимации флаттера на didUpdateWidget? - PullRequest
0 голосов
/ 05 ноября 2018

Я хочу обновить таймер по требованию, но я не уверен, как это сделать. Я хочу проверить, что определенные условия выполняются при обновлении виджета, прежде чем изменять продолжительность. До сих пор я пытался поиграться с функцией didUpdateWidget, но я получаю одну ошибку тикера. Когда я изменяю миксин на TickerProviderStateMixin, продолжительность не обновляется.

class _ProgressBarState extends State<ProgressBar>
    with SingleTickerProviderStateMixin {

  int _duration;
  int _position;
  bool _isPaused;

  Animation animation;
  AnimationController animationController;

  @override
  void initState() {
    super.initState();
    _duration = widget.duration;
    _position = widget.position;
    _isPaused = widget.isPaused;
    animationController = AnimationController(
    duration: Duration(milliseconds: _duration), vsync: this);
    animation = Tween(begin: 0.0, end: 1.0).animate(animationController);
  }

  @override
    void didUpdateWidget(ProgressBar oldWidget) {
      // TODO: implement didUpdateWidget
      setState(() {
        _duration = widget.duration;
        _position = widget.position;
        _isPaused = widget.isPaused;
      });

      updateController(oldWidget);
      super.didUpdateWidget(oldWidget);
    }


  void updateController(ProgressBar oldWidget){
    if(oldWidget.duration != _duration){
      animationController.dispose();
      animationController = AnimationController(duration: Duration(milliseconds: _duration), vsync:this);
    }
    if(_isPaused){
      animationController.stop();
    } else{
        animationController.forward(from: _position/_duration);
      }
  }
//...
}

1 Ответ

0 голосов
/ 08 ноября 2018

Я понял, что после тщательного изучения документов, вы можете просто изменить свойства AnimationController напрямую. ха-ха ...

animationController.duration = Duration(milliseconds: _duration)
...