美文网首页Flutter
Flutter(二十八)NotificationListener

Flutter(二十八)NotificationListener

作者: 天色将变 | 来源:发表于2019-07-19 07:13 被阅读1次

在widget树中,子widget滚动时会向上发送notification,通过NotificationListener可以监控到该notification。NotificationListener也是一个widget,可以将被监控的widget放入其child内。

NotificationListener
const NotificationListener({
    Key key,
    @required this.child,  被监控的子widget树
    this.onNotification,  监控到notification后的回调方法。
  }) 
  • onNotification(ScrollNotification notification) , 此方法需要一个返回值,表示是否拦截住notification,如果是true,那么notifcation到此为止;如果是false,那么notification会继续向更外层widget传递。参数ScrollNotification包含了监听到的信息。
  • ScrollNotification
ScrollNotification({
    @required this.metrics,   所有信息都在这里存储
    @required this.context,
  });
  • print(metrics.pixels);// 当前位置
  • print(metrics.atEdge);//是否在顶部或底部
  • print(metrics.axis);//垂直或水平滚动
  • print(metrics.axisDirection);// 滚动方向是down还是up
  • print(metrics.extentAfter);//视口底部距离列表底部有多大
  • print(metrics.extentBefore);//视口顶部距离列表顶部有多大
  • print(metrics.extentInside);//视口范围内的列表长度
  • print(metrics.maxScrollExtent);//最大滚动距离,列表长度-视口长度
  • print(metrics.minScrollExtent);//最小滚动距离
  • print(metrics.viewportDimension);//视口长度
  • print(metrics.outOfRange);//是否越过边界
image.png
class _MyHomePageState extends State<MyHomePage> {


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: NotificationListener<ScrollNotification>(
        onNotification: (ScrollNotification notification){
          ScrollMetrics metrics = notification.metrics;
          print(metrics.pixels);// 当前位置
          print(metrics.atEdge);//是否在顶部或底部
          print(metrics.axis);//垂直或水平滚动
          print(metrics.axisDirection);// 滚动方向是down还是up
          print(metrics.extentAfter);//视口底部距离列表底部有多大
          print(metrics.extentBefore);//视口顶部距离列表顶部有多大
          print(metrics.extentInside);//视口范围内的列表长度
          print(metrics.maxScrollExtent);//最大滚动距离,列表长度-视口长度
          print(metrics.minScrollExtent);//最小滚动距离
          print(metrics.viewportDimension);//视口长度
          print(metrics.outOfRange);//是否越过边界
          print('------------------------');
          return true;
        },
          child: ListView.builder(
            itemExtent: 50,
              itemCount: 50,
              itemBuilder: (BuildContext context,int index){
              return ListTile(title: Text(index.toString()),);
              },
          ),
      ),
    );
  }
}

输出值:

I/flutter (30825): 1896.5714285714284
I/flutter (30825): true
I/flutter (30825): Axis.vertical
I/flutter (30825): AxisDirection.down
I/flutter (30825): 0.0
I/flutter (30825): 1896.5714285714284
I/flutter (30825): 603.4285714285714
I/flutter (30825): 1896.5714285714284
I/flutter (30825): 0.0
I/flutter (30825): 603.4285714285714
I/flutter (30825): false
I/flutter (30825): ------------------------

相关文章

网友评论

    本文标题:Flutter(二十八)NotificationListener

    本文链接:https://www.haomeiwen.com/subject/njmdlctx.html