Flutter 2. После миграции у меня возникла проблема с прокруткой animateTo(...), вызываемой внутри addPostFrameCallback
По сути, у меня есть прокручиваемый столбец разделов. Каждый раздел представляет собой плитку расширения с дочерним атрибутом [ ListView ]. (ListView использует NeverScrollPhysics, поэтому все дочерние элементы ListView строятся одновременно). Когда я открываю раздел (расширяю плитку), я хочу, чтобы Scrollview прокручивался, например открытая плитка (одновременно может быть открыта только одна плитка) находится в самом верху. Как видите, если внизу недостаточно места для прокрутки столбца, я добавляю еще один. Я звоню
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);
}
});
он начинает работать нормально, но это не похоже на хорошее решение. Любые мысли о том, что я делаю неправильно и как это можно исправить должным образом, будут оценены. Спасибо!