После перехода на новый экран и обратно состояние анимированных объектов остается прежним. То есть, как только анимация заканчивается, я перехожу на новый экран с помощью StatusListener, однако, как только я возвращаюсь с этого экрана, состояние анимации не изменяется. Это не желаемое поведение, и я был бы признателен за помощь или объяснения по этому поводу.
import 'package:flutter/material.dart';
import 'ad_screen.dart';
class Advertisement extends StatelessWidget {
final Animation<double> opacity;
final Animation<Offset> offsetDate;
final Animation<Offset> offsetName;
Advertisement({
@required this.opacity,
@required this.offsetDate,
@required this.offsetName,
});
@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
AnimatedContainer(
duration: Duration(milliseconds: 400),
height: MediaQuery.of(context).size.height * 0.18,
width: MediaQuery.of(context).size.width - 50.0,
margin: const EdgeInsets.only(left: 40.0, right: 10.0),
decoration: BoxDecoration(
color: Colors.white,
image: DecorationImage(
image: ExactAssetImage('assets/reviewer.jpg'),
fit: BoxFit.cover,
),
),
child: FadeTransition(
opacity: opacity,
child: Container(color: Colors.black38),
),
),
Positioned(
top: MediaQuery.of(context).size.height * 0.02,
left: 10.0,
child: Row(
children: <Widget>[
SlideTransition(
position: offsetDate,
child: Container(
height: MediaQuery.of(context).size.height * 0.09,
width: MediaQuery.of(context).size.width * 0.15,
decoration: BoxDecoration(
color: Colors.yellow,
borderRadius: BorderRadius.circular(3.0),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'16',
textScaleFactor: 2.5,
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w300,
),
),
Padding(
padding: const EdgeInsets.only(bottom: 3.0),
child: Text(
'September'.toUpperCase().substring(0, 4),
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w400,
),
),
),
],
),
),
),
SlideTransition(
position: offsetName,
child: Padding(
padding: const EdgeInsets.only(left: 12.0),
child: Text(
'SOME ART SHOW',
textScaleFactor: 1.5,
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w700,
),
),
),
),
],
),
),
],
);
}
}
class AnimatedAdvertisement extends StatefulWidget {
AnimatedAdvertisement({Key key}) : super(key: key);
@override
State createState() => _AnimatedAdvertisementState();
}
class _AnimatedAdvertisementState extends State<AnimatedAdvertisement>
with TickerProviderStateMixin {
static final Animatable<Offset> _offsetDate = Tween<Offset>(
begin: const Offset(0.0, 0.0),
end: const Offset(-1.4, 0.0),
).chain(
CurveTween(
curve: Curves.elasticInOut,
),
);
static final Animatable<Offset> _offsetName = Tween<Offset>(
begin: const Offset(0.0, 0.0),
end: const Offset(2.5, 0.0),
).chain(
CurveTween(
curve: Curves.elasticInOut,
),
);
AnimationController _controller;
Animation<double> _opacity;
Animation<Offset> _offsetDateAnim;
Animation<Offset> _offsetNameAnim;
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(milliseconds: 400), vsync: this);
_opacity = Tween<double>(begin: 1.0, end: 0.0).animate(_controller)
..addStatusListener((listener) {
if (listener == AnimationStatus.completed) {
Navigator.push(context, MaterialPageRoute(builder: (_) {
return CustomScreen();
}));
}
});
_offsetDateAnim = _controller.drive(_offsetDate);
_offsetNameAnim = _controller.drive(_offsetName);
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () => _controller.forward(),
child: Advertisement(
opacity: _opacity,
offsetDate: _offsetDateAnim,
offsetName: _offsetNameAnim,
),
);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
}