Использовать тот же AnimationController над перестроить - PullRequest
0 голосов
/ 07 апреля 2020

Я использую Tragtargets, которые будут расширяться, если что-то находится над ними. Расширяющаяся анимация всегда начинается с 0, а уменьшающаяся анимация с 1. Как я могу использовать один и тот же контроллер анимации для расширения сжимающегося? Таким образом, если Цель перестраивает себя и хочет сжаться, она начинается с последнего значения контроллера, которое было при расширении. Например, приведенный ниже код должен начинаться с того места, где он был, до перестройки. Есть ли способ достичь такой цели?

void main() => runApp(new MyApp());

class MyApp extends StatefulWidget {
  AnimationController controller;

  @override
  MyAppState createState() => new MyAppState();
}

class MyAppState extends State<MyApp> {

  @override
  Widget build(BuildContext context) {
    final title = 'Animated Container on Build';

    return new MaterialApp(
      title: title,
      home: Scaffold(
          appBar: AppBar(
            title: Text(title),
          ),
          body: Column(
            children: <Widget>[
              Row(
                children: <Widget>[
                  AniContainer(UniqueKey(),Duration(seconds: 2),widget.controller),
                ],
              ),
              RaisedButton(
                child: Text('press me'),
                  onPressed: ()=> setState(() {

                  }))
            ],
          )
      ),
    );
  }
}

class AniContainer extends StatefulWidget {
  Duration duration;
  AnimationController controller;
  AniContainer(Key key,this.duration,this.controller):super(key: key);
  @override
  _AniContainerState createState() => _AniContainerState();
}

class _AniContainerState extends State<AniContainer> with TickerProviderStateMixin{

  AnimationController _animationController;

  double getStart() {
    if (widget.controller==null) {
      return 1;
    }
    else {
      print(widget.controller.value);
      return widget.controller.value;
    }
  }

  @override
  void initState() {
    super.initState();
    widget.controller= AnimationController(vsync: this, duration:widget.duration,value: getStart())..reverse();
    _animationController= widget.controller;
  }

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

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      crossAxisAlignment: CrossAxisAlignment.center,
      children: <Widget>[
        SizeTransition(
          axis: Axis.vertical,
          sizeFactor: _animationController,
          child: Container(
            height: 100,
            width: 100,
            color: Colors.red,
          ),
        ),
        Container(
          width: 100,
          height: 100,
          color: Colors.grey,
        )
      ],
    );
  }
}
...