Flutter使用ScrollController检测用户滚动

时间:2019-11-14 17:00:26

标签: flutter

项目

嗨,我试图用我的自定义constroller和一个监听器在flutter中构建一个简单的列表。 这是代码

class Test2 extends StatefulWidget {
  @override
  _Test2State createState() => _Test2State();
}

class _Test2State extends State<Test2> {
  ScrollController scrollController = ScrollController();

  @override
  void initState() {
    scrollController.addListener((){
      print('controller called');
    });
    super.initState();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: ListView.builder(
          controller: scrollController,
      itemCount: 8,
      itemBuilder: (context, index) {
        return Padding(
          padding: const EdgeInsets.all(8.0),
          child: Container(
            color: Colors.white,
            height: 50,
          ),
        );
      },
    ));
  }
}

问题

我的代码按预期工作,但是我试图检测用户滑动,即使没有要滑动的内容也是如此。到目前为止,如果调用用户滑动滚动侦听器时列表溢出屏幕,但是当项目列表短于屏幕大小时,则不会发生这种情况。 我该如何强制收听者始终收听?

2 个答案:

答案 0 :(得分:1)

也许这段代码可以为您提供帮助。

将支架包裹在NotificationListener上可以监听所有事件,即使itemCount为零

不要忘记提供一个 AlwaysScrollableScrollPhysics 物理对象

import 'dart:math' as math;

import 'package:flutter/material.dart';

class TestPage extends StatefulWidget {
  @override
  _TestPageState createState() => _TestPageState();
}

class _TestPageState extends State<TestPage> {
  @override
  Widget build(BuildContext context) {
    final ScrollController scrollController = ScrollController();

    return NotificationListener(
      child: Scaffold(
        body: ListView.builder(
          controller: scrollController,
          physics: const AlwaysScrollableScrollPhysics(),
          itemCount: 0,
          itemBuilder: (context, index) {
            return Container(
              color: Colors.black,
              height: 50,
            );
          },
        ),
      ),
      onNotification: (notificationInfo) {
        if (notificationInfo is ScrollStartNotification) {
          print("scroll");
          print("detail:"+notificationInfo.dragDetails.toString());
          /// your code
        }
        return true;
      },
    );
  }
}

答案 1 :(得分:0)

您必须通过以下方式将自定义滚动侦听器传递给该函数:

scrollController.addListener(_scrollListener);

完成:

@override
  void initState() {
    scrollController.addListener(_scrollListener);
    super.initState();
}

和您的自定义滚动侦听器方法:

_scrollListener() {
    if (_controller.offset >= _controller.position.maxScrollExtent &&
        !_controller.position.outOfRange) {
      setState(() {
        message = "reach the bottom";
      });
    }
    if (_controller.offset <= _controller.position.minScrollExtent &&
        !_controller.position.outOfRange) {
      setState(() {
        message = "reach the top";
      });
    }
  }

来源:https://medium.com/@diegoveloper/flutter-lets-know-the-scrollcontroller-and-scrollnotification-652b2685a4ac