Flutter slideTransition не анимация - PullRequest
0 голосов
/ 16 ноября 2018

Итак, я пытаюсь создать элемент тривиального слайд-перехода во флаттере, и у меня возникли некоторые трудности.Что ниже делает, это ждет время анимации, а затем просто отображает Text("hello there sailor").Я не знаю, почему это не анимация - похоже, очень похоже на предыдущий пост, в котором есть тривиальный пример ( Скользящая анимация внизу в флаттере ).

Вот как я называюкод ниже: DeleteCheck(offsetBool: widget.model.deleteNotify, widthSlide: 0.50*width100) где double width100 = MediaQuery.of(context).size.width;.

Кто-нибудь видит, что я делаю неправильно?

class DeleteCheck extends StatefulWidget{

  final offsetBool;
  final double widthSlide;

  DeleteCheck({
    Key key, 
    this.offsetBool, 
    this.widthSlide
  }): super(key: key);

  @override 
  State<StatefulWidget> createState() {
    return new _MyDeleteCheck();
  }
}

class _MyDeleteCheck extends State<DeleteCheck> with TickerProviderStateMixin {
  AnimationController _controller;
  Animation<Offset> _offsetFloat; 

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

    _controller = AnimationController(
      vsync: this,
      duration: const Duration(seconds: 1),
    );

    _offsetFloat = Tween<Offset>(begin: Offset(widget.widthSlide, 0.0), end: Offset.zero)
        .animate(_controller);

    _offsetFloat.addListener((){
      setState((){});
    });

    _controller.forward();

  }

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

  @override
  Widget build(BuildContext context) {
    double height100 = MediaQuery.of(context).size.height;
    double width100 = MediaQuery.of(context).size.width;
    return new SlideTransition(
      position: _offsetFloat,
      child: Container(
        color: Colors.cyan,
        width: 0.525*width100-3.0,
        child: Text("hello there sailor")
      )
    );
  }
}

1 Ответ

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

У меня для вас хорошие новости!Ваш код работает!:) Анимация выглядит так, как будто ее нет, потому что расстояние, которое она перемещает, составляет огромно .Смещение , переданное в SlideTransition , зависит от размера дочернего элемента.Например, у вашего ребенка width: 100.0, а вы смещены на Offset(2.0, 0.0), ваш ребенок переместится на 200.0 пикселей вправо.

Просто попробуйте изменить begin: Offset(widget.widthSlide, 0.0), end: Offset.zero на begin: Offset(2.0, 0.0), end: Offset.zero.Вы увидите текст, медленно анимирующийся справа от центра экрана.Поэтому вам просто нужно настроить параметризацию.

SlideTransition changed

В любом случае вот несколько дополнительных советов по оптимизации вашего кода:

  • Если вы используете предварительно созданные AnimatedWidgets , такие как SlideTransition , вам не нужно вызывать addListener с setState на контроллере.AnimatedWidget позаботится об этом сам.Следовательно, вы можете удалить следующие строки:

lines:

_offsetFloat.addListener((){
  setState((){});
});
  • Также нет необходимости вызывать конструкторы const.Вы можете просто оставить это ключевое слово как new.Компилятор оптимизирует и выберет правильный конструктор в каждом случае.
...