颤动滚动到列表中的特定项目

clo*_*ker 1 flutter flutter-layout

我在 Flutter 中有一个ListView允许用户动态添加项目的项目。添加项目后,我希望列表滚动到已添加的项目。我已将 a 附加ScrollController到,ListView以便我可以用来animateTo滚动,但我不确定如何确定向下滚动到的偏移量。我有这样的事情:

_scrollController.animateTo(
    addedIndex.toDouble() * 100,
    curve: Curves.easeOut,
    duration: const Duration(milliseconds: 300),
);
Run Code Online (Sandbox Code Playgroud)

其中addedIndex是项目添加到列表的顺序。但这并不完全有效,而且似乎只有当我能够计算出列表中每个项目的高度时它才有效,我不知道该怎么做。有没有更好的方法来确定滚动到的确切位置?

nul*_*ull 7

首先,创建一个新的全局密钥。

\n\n
final GlobalKey globalKey = GlobalKey();\n
Run Code Online (Sandbox Code Playgroud)\n\n

其次,将 globalKey 添加到要移动到的小部件中。

\n\n

然后,根据globalKey获取widget位置。

\n\n
RenderBox box = globalKey.currentContext.findRenderObject();\nOffset offset = box.localToGlobal(Offset.zero);\n
Run Code Online (Sandbox Code Playgroud)\n\n

获取的widget位置是相对于当前页面显示状态而言的,widget高度包括状态栏和AppBar高度。

\n\n

状态栏高度

\n\n
import 'dart:ui\xe2\x80\x99; \nMediaQueryData.fromWindow(window).padding.top\n
Run Code Online (Sandbox Code Playgroud)\n\n

应用栏高度 56.0

\n\n

需要添加scrollView的偏移量

\n\n
double animationHeight = _controller.offset + offset.dy - MediaQueryData.fromWindow(window).padding.top - 56.0;\n_controller.animateTo(animationHeight, duration: Duration(milliseconds: 500), curve: Curves.decelerate);\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

希望它能帮助你。

\n