Как я могу использовать анимацию / анимацию, не запущенную во время перехода героя во Flutter? - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть сетка карточек с изображением продуктов.Когда карта нажата, я хочу, чтобы она перевернулась (вокруг оси Y), чтобы показать «другую сторону», которая показывает детали, одновременно увеличиваясь, чтобы заполнить экран.

  • Продолжительность 0.0 -Карта показывает лицевую сторону и находится в виде сетки
  • Продолжительность 0,5 - Карта находится на 50% пути к полноэкранному и перпендикулярному экрану (лицевая сторона обращена вправо, «обратная» сторона обращена влево)
  • Длительность 1.0 - Карточка полностью раскрыта, и отображается карта «назад».

Мне удалось запустить анимацию сальто, но я не могу понять, как это сделать.также заставьте это бежать во время перехода Героя.Из этой статьи может показаться, что мне может понадобиться использовать flightShuttleBuilder, чтобы иметь возможность анимировать наложение, но моя анимация не запускается во время перехода:

return Hero(
  tag: 'test',
  flightShuttleBuilder: (
    BuildContext flightContext,
    Animation<double> animation,
    HeroFlightDirection flightDirection,
    BuildContext fromHeroContext,
    BuildContext toHeroContext,
  ) {
    final Hero toHero = toHeroContext.widget;
    return Transform(
      transform: Matrix4.identity()..rotateY(-pi * animation.value),
      alignment: FractionalOffset.center,
      child: toHero,
    );
  },
  child: Card(...),
);

1 Ответ

0 голосов
/ 06 февраля 2019

Как оказалось, flightShuttleBuilder испускает значения только в начале и в конце перехода, а не на протяжении всей анимации.При получении от этой проблемы на GitHub это, по-видимому, ожидаемое поведение.

Обходной путь - создать собственный переход, который начинается с AnimatedWidget;который будет выдавать значения нормально и может использоваться в flightShuttleBuilder:

class FlipcardTransition extends AnimatedWidget {
  final Animation<double> flipAnim;
  final Widget child;

  FlipcardTransition({@required this.flipAnim, @required this.child})
      : assert(flipAnim != null),
        assert(child != null),
        super(listenable: flipAnim);

  @override
  Widget build(BuildContext context) {
    return Transform(
      transform: Matrix4.identity()
        ..rotateY(-pi * flipAnim.value),
      alignment: FractionalOffset.center,
      child: child,
    );
  }
}

...

flightShuttleBuilder: (BuildContext flightContext,
  Animation<double> animation,
  HeroFlightDirection flightDirection,
  BuildContext fromHeroContext,
  BuildContext toHeroContext,) {
    final Hero toHero = toHeroContext.widget;
    return FlipcardTransition(
      flipAnim: animation,
      child: toHero,
    );
},
...