基本上,我有一个可滚动的部分列。每个部分都是一个扩展图块,具有 [ ListView ] 作为子属性。(ListView 使用 NeverScrollPhysics,因此 ListView 的所有子项都是一次构建的)。当我打开一个部分(展开磁贴)时,我希望 Scrollview 滚动,例如打开的磁贴(一次只能打开一个磁贴)位于最顶部。如您所见,如果底部没有足够的空间使列可滚动,我会添加一个额外的空间。我打电话animateTo()
,里面addPostFrameCallback
。在我迁移到 Flutter 2 之前,它在发布和调试模式下都能正常工作。但现在它只在调试模式下工作正常,在发布时,滚动视图不滚动(我已经检查过scrollOffset
计算正确)。在发布模式下,它仅在我快速将折叠状态从打开-关闭-打开更改时才起作用。而且它似乎也适用于最底部的部分。应为其添加额外空间。在其他情况下,它只是扩展而不执行滚动。
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);
}
});
它开始工作正常,但它似乎不是一个好的解决方案。任何关于我做错了什么以及如何以适当方式修复它的想法都将不胜感激。谢谢!