Анимация не сбрасывается после перехода на новый экран и обратно - PullRequest
0 голосов
/ 08 ноября 2018

После перехода на новый экран и обратно состояние анимированных объектов остается прежним. То есть, как только анимация заканчивается, я перехожу на новый экран с помощью 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();
  }
}
...