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

时间:2019-07-22 00:37:27

标签: flutter flutter-layout

我在Flutter中有一个ListView,允许用户向其中动态添加项目。添加项目后,我希望列表滚动到添加的项目。我在ScrollController上附加了ListView,因此可以使用animateTo进行滚动,但是不确定如何确定向下滚动的偏移量。我有这样的东西:

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

其中addedIndex是项目添加到列表的顺序。但这并不是很有效,并且似乎只有在我能弄清楚列表中每个项目的高度时才能起作用,但我不确定该怎么做。有没有一种更好的方法可以准确地找到要滚动到的位置?

1 个答案:

答案 0 :(得分:0)

首先,创建一个新的globalKey。

final GlobalKey globalKey = GlobalKey();

第二,将globalKey添加到要移动到的小部件。

然后,基于globalKey获取窗口小部件的位置。

RenderBox box = globalKey.currentContext.findRenderObject();
Offset offset = box.localToGlobal(Offset.zero);

获得的窗口小部件位置是相对于当前页面显示状态的,窗口小部件的高度包括状态栏和AppBar的高度。

状态栏高度

import 'dart:ui’; 
MediaQueryData.fromWindow(window).padding.top

AppBar高度56.0

scrollView的偏移量需要添加

double animationHeight = _controller.offset + offset.dy - MediaQueryData.fromWindow(window).padding.top - 56.0;
_controller.animateTo(animationHeight, duration: Duration(milliseconds: 500), curve: Curves.decelerate);

希望它会对您有所帮助。