Flutter中ListView和GridView滚动的监听

1.监听方式
1.1 controller监听
  • 可以设置默认的offset的值
  • 监听滚动,也可以监听滚动的位置
import 'package:flutter/material.dart';

//函数入口
main() =>runApp(MyApp());

class MyApp extends StatelessWidget {

  //重写方法
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return MaterialApp(
      home: JCHomePage() ,
    );
  }
}

StatefulWidget

  • 创建一个状态类

class JCHomePage extends StatefulWidget {

  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _JCHomeStatue();
  }

}


class _JCHomeStatue extends State<JCHomePage>{
  //初始化一个偏移量为100 向上偏移的100
  ScrollController controller = ScrollController(initialScrollOffset: 100);

  var _flag = false;


  //重写生命周期方法
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    controller.addListener((){

      //更新状态
      setState(() {
        _flag = controller.offset >= 1000;
      });
      print("监听滚动的位置 ${controller.offset}");

    });
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
        title: Text("滚动的监听方式"),
      ),
      body: ListView.builder(
        controller: controller,
        itemCount: 100,
        itemBuilder: (BuildContext ctx ,int index){
          return ListTile(
            leading: Icon(Icons.people),
            trailing: Icon(Icons.delete),
            title: Text("恋人${index + 1}"),
          );

        },
      ),
      floatingActionButton: _flag ?  FloatingActionButton(
        child: Icon(Icons.arrow_upward),
        onPressed: (){
          setState(() {
            controller.animateTo(0, duration: Duration(seconds: 1), curve: Curves.easeIn);
          });
        },
      ):null,
    );
  }
}




在这里插入图片描述

当 滚动的 距离 大于 1000时 显示 回到顶部的按钮
在这里插入图片描述

在这里插入图片描述

1.2 NotificationListener 通过监听

class JCHomePage extends StatefulWidget {

  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _JCHomeStatue();
  }

}


class _JCHomeStatue extends State<JCHomePage>{
  //初始化一个偏移量为100 向上偏移的100
  ScrollController controller = ScrollController(initialScrollOffset: 100);
  var _flag = false;

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
        title: Text("滚动的监听方式"),
      ),

      //添加一个通知(系统会自动调用)
      body: NotificationListener(
        onNotification:(ScrollNotification notification){

          //开始滚动
          if(notification is ScrollStartNotification){
            print("开始滚动");

          } else if (notification is ScrollUpdateNotification){
            // 更新滚动
            setState(() {
              _flag = notification.metrics.pixels >= 1000;
            });
            print("正在滚动---总滚动的距离${notification.metrics.maxScrollExtent},----已经滚动的距离${notification.metrics.pixels}");

          } else if (notification is ScrollEndNotification){
            //结束滚动
            print("结束滚动");
          }

          // 返回值是防止冒泡, false是可以冒泡
          return true;
        },
        child: ListView.builder(
          controller: controller,
          itemCount: 100,
          itemBuilder: (BuildContext ctx ,int index){
            return ListTile(
              leading: Icon(Icons.people),
              trailing: Icon(Icons.delete),
              title: Text("恋人${index + 1}"),
            );

          },
        ),
      ),
      floatingActionButton: _flag ?  FloatingActionButton(
        child: Icon(Icons.arrow_upward),
        onPressed: (){
          setState(() {
            controller.animateTo(0, duration: Duration(seconds: 1), curve: Curves.easeIn);
          });
        },
      ):null,
    );
  }
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值