dart 有没有办法在ListView.builder中自动滚动到一个元素?

lyfkaqu1  于 2023-02-27  发布在  其他
关注(0)|答案(2)|浏览(178)

我的目标是当我点击GoogleMaps中的标记时滚动到正确的人。每个标记都已经保存了对列表中相应索引的引用,但我不知道如何使列表自动滚动。感谢您的帮助:)

bq3bfh9z

bq3bfh9z1#

您可以将GlobalKey指定给要滚动到的项目,并使用ScrollPosition.ensureVisible

全局密钥

您需要全局密钥才能访问小部件的RenderObject
您需要将此全局密钥作为变量存储在StatefulWidget中(最好是)。
∮ ∮ ∮ ∮ ∮
您还需要存储一个滚动控制器,以便滚动到列表视图的位置。
下面是在小部件的State中执行此操作的方法:

final itemKey = GlobalKey();
final scrollController = ScrollController();

@override
void dispose() {
  scrollController.dispose();
  super.dispose();
}

@override
Widget build(BuildContext context) {
  // Return your widget tree in here.
  // I am only showing the ListView section.
  ...
  ListView(
    ...,
    controller: scrollController,
    // You can also use a builder list view or w/e else.
    // You only need to supply the GlobalKey to exactly one item.
    children: <Widget>[
       SomeWidget(
         key: itemKey,
         ...,
       ),
    ],
  )
  ...
}

现在,您可以滚动到所选项目:

scrollController.position.ensureVisible(
  itemKey.currentContext.findRenderObject()!,
  alignment: 0.5, // How far into view the item should be scrolled (between 0 and 1).
  duration: const Duration(seconds: 1),
);
w8rqjzmb

w8rqjzmb2#

您还可以使用Scrollable小部件滚动到特定小部件:

Scrollable.ensureVisible(
  itemKey.currentContext,
  duration: const Duration(milliseconds: 500)
);

itemKey是一个GlobalKey,它被分配给小工具的key属性

相关问题