Анимация на основе скорости списка

Я работаю над реализацией примеров анимации во флаттере, основываясь на этом: https://www.behance.net/gallery/55023357/Flyer-Flight-Booking

Одна из анимаций показывает список, который изменяется в зависимости от пользовательской прокрутки. Для этого мне нужно знать, когда скорость прокрутки пользователя выше или ниже определенного порога.

Я знаю, что могу получить доступ к ScrollNotifications, обернув ListView в NotificationListener. В уведомлениях хранятся такие данные, как простоя, обратная и прямая прокрутка, тип взаимодействия прокрутки и т. Д.

К сожалению, он не хранит никакой информации о смещениях или скорости дельта-прокрутки. Я пытался получить доступ к ScrollActivity из ScrollController, прикрепленного к ListView. Кажется, что действие защищено, что может привести к поломке моего приложения при выпуске. Вот некоторый код:

ScrollController _scrollController; // ListView controller
AnimationController _itemSpacingController; // Smooth change of padding for the list items

// Build the list
Widget _buildSectionPage() {
  var section = widget.section;
  var itemCount = section.cells.length;
  return NotificationListener<ScrollNotification>(
    onNotification: _onScroll,
    child: ListView.builder(
      controller: _scrollController,
      itemBuilder: (BuildContext context, int index) {
        return _buildSectionCell(
            context, section.cells[index], index, itemCount);
      },
      itemCount: itemCount,
      padding: EdgeInsets.only(right: 8.0, top: 16.0),
      itemExtent: SectionView._cellHeight +
          (1.0 + _itemSpacingController.value) * DEFAULT_ITEM_SPACING,
      physics: AlwaysScrollableScrollPhysics(),
    ),
  );
}

_buildSectionPage () устанавливает список и подключает слушателей. Они не могут _onScroll() при прокрутке ListView.

  bool _onScroll(ScrollNotification notification) {
    if (notification is UserScrollNotification) {
      if (notification.direction == ScrollDirection.idle) {
        _itemSpacingController.reverse();
      } else {
        if (_scrollController.position.activity.velocity <= 0.5) {
          _itemSpacingController.forward();
        }
      }
    }
    return false;
  }

_scrollController.position.activity.velocity

защищен. Кажется, это единственный способ получить текущую скорость события прокрутки. Знаете ли вы какой-либо другой способ получить текущую скорость ScollNotification?

0 ответов

Другие вопросы по тегам