Примените анимацию до удаления виджета

#flutter #animation #widget #show-hide

Вопрос:

Простое отображение-скрытие анимации:

 class ShowHide extends StatelessWidget {
  final double delay;
  final Widget child;
  final double duration;
  final bool isShow;
  ShowHide({
    this.delay = 1,
    this.duration = 1,
    this.child,
    this.isShow = true,
  });

  @override
  Widget build(BuildContext context) {
    final tween = MultiTween<AniProps>()
      ..add(AniProps.scale, Tween(begin: 0.0, end: 1.0),
          Duration(milliseconds: (500 * duration).round()), Curves.linear);

    return CustomAnimation<MultiTweenValues<AniProps>>(
      delay: Duration(milliseconds: (200 * delay).round()),
      control: isShow
          ? CustomAnimationControl.PLAY
          : CustomAnimationControl.PLAY_REVERSE,
      duration: tween.duration,
      tween: tween,
      child: child,
      builder: (context, child, animation) => Transform.scale(
        scale: animation.get(AniProps.scale),
        alignment: Alignment.center,
        child: child,
      ),
    );
  }
}
 

Мой виджет верхнего уровня отображает список миниатюр изображений:

 Column(
      mainAxisAlignment: MainAxisAlignment.start,
      mainAxisSize: MainAxisSize.max,
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Form(
          key: widget.addEventFormKey,
          onChanged: () {},
          child: Expanded(
            child: SingleChildScrollView(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.start,
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: [
                  
                  Visibility(
                    child: AttachmentsListWidget(
                      items: _attachments,
                      onAttachmentDeleted: (String attachment) {
                        setState(() {
                          File(attachment).delete();
                          _attachments.remove(attachment);
                        });
                      },
                    ),
                    visible: _attachments.length > 0,
                 
                ],
              ),
            ),
          ),
        ),
      ],
    );
  }
 

AttachmentsListWidget является ли список миниатюр изображений без состояния:

 class AttachmentsListWidget extends StatelessWidget {
  const AttachmentsListWidget({
    Key key,
    @required this.items,
    @required this.onAttachmentDeleted,
  }) : super(key: key);

  final List<String> items;
  final Function(String) onAttachmentDeleted;

  @override
  Widget build(BuildContext context) {
    var _thumbnailsScrollController = ScrollController();
    final thumbnails = <Widget>[];
    Widget thumbnailsWidget;

    if (items.length > 0) {
      for (int i = 0; i < items.length; i  ) {
        thumbnails.add(
          AttachmentWidget(
            attachment: items[i],
            onDeleteClicked: (String attachment) => onAttachmentDeleted(attachment),
          ),
        );
      }
      thumbnailsWidget = Container(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Scrollbar(
              isAlwaysShown: true,
              controller: _thumbnailsScrollController,
              child: SingleChildScrollView(
                controller: _thumbnailsScrollController,
                scrollDirection: Axis.horizontal,
                child: Row(
                  children: thumbnails,
                  crossAxisAlignment: CrossAxisAlignment.start,
                ),
              ),
            ),
          ],
        ),
      );
    } else {
      thumbnailsWidget = Container();
    }
    return thumbnailsWidget;
  }
}
 

Это не проблема, чтобы применить анимацию для показа нового эскиза — мне нужно, чтобы окружить мой AttachmentWidget ShowHide :

 for (int i = 0; i < items.length; i  ) {
        thumbnails.add(
          ShowHide(
            child: AttachmentWidget(
              attachment: items[i],
              onDeleteClicked: (String attachment) => onAttachmentDeleted(attachment),
            ),
          ),
        );
      }
 

Но я не уверен, как применить анимацию до удаления миниатюр. При удалении миниатюры из списка весь виджет восстанавливается и применяется новый список вложений. Таким образом, для удаления отдельных миниатюр не будет применена никакая анимация.

У тебя есть какие-нибудь идеи?

Комментарии:

1. Вы пробовали анимированный список? Это кажется точным вариантом его использования: youtube.com/watch?v=ZtfItHwFlZ8

2. Я не могу использовать список, потому что я буду вынужден указать высоту, которая зависит от размера изображения.