Flutter slideTransition没有动画

时间:2018-11-15 22:04:11

标签: user-interface animation mobile flutter slide

所以我试图在颤动中创建一个简单的幻灯片过渡元素,但遇到了一些困难。下面的操作是等待动画时间,然后仅显示Text("hello there sailor")。我不知道为什么这没有动画效果-看起来与以前的例子非常相似(Sliding animation to bottom in flutter)。

这就是我调用以下代码的方式: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 :(得分:8)

我对你有个好消息!您的代码正在运行! :)动画看起来好像没有发生,因为它移动的距离是巨大。传递给OffsetSlideTransition与其子元素的大小有关。例如,您的孩子有width: 100.0,而您偏移了Offset(2.0, 0.0),则您的孩子将向右移动了200.0像素。

只要尝试 更改begin: Offset(widget.widthSlide, 0.0), end: Offset.zerobegin: Offset(2.0, 0.0), end: Offset.zero。您会看到文本从屏幕的右到中心缓慢移动。因此,您只需要调整参数即可。

SlideTransition changed

无论如何,这里有一些用于优化代码的其他建议:

  • 如果您正在使用像AnimatedWidgets这样的预制SlideTransition,则不需要在控制器上用addListener调用setStateAnimatedWidget自己负责。因此,您可以删除以下几行:

行:

_offsetFloat.addListener((){
  setState((){});
});
  • 此外,也不必调用const构造函数。您可以像new那样保留此关键字。每种情况下,编译器都会优化并选择合适的构造函数。