AnimationController(vsync: this, duration: Duration(seconds: 2)); _animation = Tween(begin: -1.0, end: 0.0).animate(CurvedAnimation( parent: _controller, curve: Curves.fastOutSlowIn, ))..addStatusListener(handler); _lateAnimation = Tween(begin: -1.0, end: 0.0).animate(CurvedAnimation( parent: _controller, curve: Interval( 0.2, 1.0, curve: Curves.fastOutSlowIn, ))); } void handler(status) { if (status == AnimationStatus.completed) { _animation.removeStatusListener(handler); _controller.reset(); _animation = Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation( parent: _controller, curve: Curves.fastOutSlowIn, )); _lateAnimation = Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation( parent: _controller, curve: Interval( 0.2, 1.0, curve: Curves.fastOutSlowIn, ))) ..addStatusListener((status) { if (status == AnimationStatus.completed) { Navigator.pop(context); } }); _controller.forward(); } } Animation _lateAnimation; @override void initState() { super.initState(); _controller = AnimationController(vsync: this, duration: Duration(seconds: 2)); _animation = Tween(begin: -1.0, end: 0.0).animate(CurvedAnimation( parent: _controller, curve: Curves.fastOutSlowIn, ))..addStatusListener(handler); _lateAnimation = Tween(begin: -1.0, end: 0.0).animate(CurvedAnimation( parent: _controller, curve: Interval( 0.2, 1.0, curve: Curves.fastOutSlowIn, ))); } void handler(status) { if (status == AnimationStatus.completed) { _animation.removeStatusListener(handler); _controller.reset(); _animation = Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation( parent: _controller, curve: Curves.fastOutSlowIn, )); _lateAnimation = Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation( parent: _controller, curve: Interval( 0.2, 1.0, curve: Curves.fastOutSlowIn, ))) ..addStatusListener((status) { if (status == AnimationStatus.completed) { Navigator.pop(context); } }); _controller.forward(); } } Offset & Delay Animation