17

如何获取 Flutter ListViewGridView、 SliverList` 等内部的当前滚动偏移量?

4

3 回答 3

23
  • 如果您在滚动视图中,请使用Scrollable.of(context).position.pixels.
  • 如果您在外面,您可能想将 aScrollController作为滚动视图的控制器参数提交,然后您可以阅读controller.offset.
  • 或者,将滚动通知与NotificationListener.

这是在 Flutter Gitter 上提出的,并回答: https ://gitter.im/flutter/flutter?at=591243f18a05641b1167be0e

于 2017-05-09T22:58:44.283 回答
19

对于其他人,寻找代码实现,你可以ScrollController这样使用:

  • 使用NotificationListener

    NotificationListener<ScrollNotification>(
      onNotification: (scrollNotification) {
        print(scrollNotification.metrics.pixels); // <-- This is it.
        return false;
      },
      child: ListView.builder(
        itemCount: 200,
        itemBuilder: (c, i) => Text('Item $i'),
      ),
    )
    
  • 使用ScrollController.offset

    final ScrollController _controller = ScrollController();
    
    @override
    void initState() {
      super.initState();
      _controller.addListener(() {
        print(_controller.offset); // <-- This is it.
      });
    }
    
    @override
    void dispose() {
      _controller.dispose();
      super.dispose();
    }
    
    @override
    Widget build(BuildContext context) {
      return Scaffold(
        body: ListView.builder(
          controller: _controller,
          itemCount: 200,
          itemBuilder: (c, i) => Text('Item $i'),
        ),
      );
    }
    
于 2019-01-19T17:25:53.667 回答
0

另一种方法是NotificationListener

NotificationListener(
  child: ListView(
    controller: _scrollController,
    children: ...
  ),
  onNotification: (notification) {
    if (notification is ScrollEndNotification) {
      print(_scrollController.position.pixels);
    }
    return false;
  },
)
于 2021-12-05T18:46:23.297 回答