Pull to refresh

Comments 6

final deviceWidth = MediaQuery.of(context).size.width;
final width = deviceWidth * 0.68;

deviceWidth - это не ширина PageView, а 0.68 лучше брать из viewportFraction, что бы не ходить по всему коду и не менять в случае чего

setState(() => _scrollPosition.value = widget.pageController.page ?? 0.0);

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

AnimatedBuilder(
  animation: _scrollPosition,
  builder: (BuildContext context, Widget? child) {
    return Positioned(
      top: arrowPadding - 33,
      left: widthCard + _getArrowOffset(),
      child: Transform.rotate(
        angle: pi / 2.0,

Если уж и использовать AnimatedBuilder, то в нём нужно перестраивать только то, что нужно (то есть, нужно передать Transform в child )

Что произойдёт, если в PageController initialPage != 0 ?

Статья - это круто и я очень рад, что они появляются, но, просто, материала по Flutter становится всё больше, а качество всё меньше. Джуны, один за другим копируют код из статей и потом удивляются, почему реджектят их PR ?

Там вообще много констант, сразу бросается в глаза вот такое:
static const imageHeight = 278.0

Чтобы поменять картинку, придется править код...

Спасибо! Тут два момента:

  • размер карточки обусловлен дизайном и должен быть строго 278. Это не карусель для карточек случайного / изменяемого размера.

  • эту же константу мы используем в GraphQL для запроса картинки нужного размера из CMS

Наверно, можно было бы вынести её в тему проекта (где цвета, шрифты и прочее), но, во-первых, не уверен, что это логично — константа используется для одного элемента на одном конкретном экране. А во-вторых — это бы существенно увеличило количество кода в этой статье :)

Учитывая, что это запросы к беку с размером картинки, то лучше делать более универсальное решение (ведь, наверняка, это не единственное место, где запрашивают картинки с размером), которое просто берёт доступный размер для виджета (LayoutBuilder), а высоту карусели назвать не imageHeight

Ола! Крутой фидбек! Редко они бывают на основании столь внимательного изучения статьи.

Сразу скажу — у этой статьи нет цели научить писать идеальный код, скорее, я хотел показать способы оптимизации подобных анимаций.

deviceWidth - это не ширина PageView, а 0.68 лучше брать из viewportFraction, что бы не ходить по всему коду и не менять в случае чего

Да, константы в коде могут вызывать вопросы — здесь и правда лучше делать так, как ты говоришь. Спасибо, поправлю.

Не понимаю зачем сохранять позицию, если она уже есть.

Ты имеешь ввиду, что можно сразу подписаться на изменения, которые отдает PageController?

Так же setState не имеет смысла, так как _scrollPosition используется в AnimatedBuilder , который сам подписывается на изменения

Да, спасибо, поправлю статью. Это место переусложнено многократными изменениями в продакшн-проекте :) Не стал рефакторить для статьи, переделаю.

Что произойдёт, если в PageController initialPage != 0 ?

Скорее всего, не произойдет ничего, но перепроверю.

Статья - это круто и я очень рад, что они появляются, но, просто, материала по Flutter становится всё больше, а качество всё меньше. Джуны, один за другим копируют код из статей и потом удивляются, почему реджектят их PR ?

Спасибо ещё раз! Я написал в том числе затем, чтобы получить полезный фидбек.

Ты имеешь ввиду, что можно сразу подписаться на изменения, которые отдает PageController?

Да. Можно сразу из него извлекать текущее положение, что и делается для _scrollPosition

Sign up to leave a comment.

Articles