Flutter 2. После миграции у меня возникла проблема с прокруткой animateTo(...), вызываемой внутри addPostFrameCallback

По сути, у меня есть прокручиваемый столбец разделов. Каждый раздел представляет собой плитку расширения с дочерним атрибутом [ ListView ]. (ListView использует NeverScrollPhysics, поэтому все дочерние элементы ListView строятся одновременно). Когда я открываю раздел (расширяю плитку), я хочу, чтобы Scrollview прокручивался, например открытая плитка (одновременно может быть открыта только одна плитка) находится в самом верху. Как видите, если внизу недостаточно места для прокрутки столбца, я добавляю еще один. Я звоню , внутри . До того, как я перешел на Flutter 2, он отлично работал как в режиме релиза, так и в режиме отладки. Но теперь он работает нормально только в режиме отладки, в релизе прокрутка не прокручивается (я проверял, что посчитано правильно). В режиме релиза работает только когда я быстро меняю состояние сворачивания с открытия-закрытия-открытия. А также он отлично работает для разделов, которые находятся в самом низу. Для чего следует добавить дополнительное пространство. В других случаях он просто расширяется, и прокрутка не выполняется.

       return LayoutBuilder(builder: (context, constraints) {
              var selectedSection = sections.firstWhere(
                  (element) => element.isExpanded,
                  orElse: () => null);
              var selectedSectionIndex = sections.indexOf(selectedSection);
              scrollOffset = calculateScrollOffset(selectedSectionIndex);
              double bottomExtraSpaceHeight = calculateBottomExtraSpaceHeight(
                constraints.maxHeight,
                scrollOffset,
                selectedSection,
                sections,
              );
              bottomExtraSpace = SizedBox(height: bottomExtraSpaceHeight);
              WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
                if (_scrollController.hasClients) {
                  _scrollController.animateTo(scrollOffset,
                      duration: Duration(milliseconds: 350),
                      curve: Curves.easeIn);
                }
              });
              
              return Container(
                alignment: Alignment.topCenter,
                child: SingleChildScrollView(
                  controller: _scrollController,
                  child: Column(
                    mainAxisSize: MainAxisSize.min,
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      buildFiltersRow(),
                      buildSections(sections),
                      bottomExtraSpace
                    ],
                  ),
                ),
              );
            })

Если я изменюсь

      WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
  if (_scrollController.hasClients) {
    _scrollController.animateTo(scrollOffset,
        duration: Duration(milliseconds: 350), curve: Curves.easeIn);
  }
});

к

      Future.delayed(Duration(milliseconds: 200)).then((_) {
  if (_scrollController.hasClients) {
    _scrollController.animateTo(scrollOffset,
        duration: Duration(milliseconds: 350),
        curve: Curves.easeIn);
  }
});

он начинает работать нормально, но это не похоже на хорошее решение. Любые мысли о том, что я делаю неправильно и как это можно исправить должным образом, будут оценены. Спасибо!

0 ответов

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