# 自定义 AppBar 实现滚动渐变

# NotificationListener

利用 NotificationListener 监听子 Widget 滚动时向上发送的 notification

const NotificationListener({
  Key key,
  @required this.child, // 被监听的子widget
  this.onNotification, // 监听到notification后的回调方法
})

监听返回值详解

class _MyHomePageState extends State<MyHomePage>{
  @override
  Widget build(BuildContext context){
    return Scaffold(
      body: NotificationListener<ScrollNotification>(
        onNotification: (ScrollNotification notification){
          if(notification is ScrollUpdateNotification && notification.depth == 0){
            // 滚动且是列表滚动的时候[banner忽略] notification.depth  第0个元素滚动的时候
            ScrollMetrics metrics = notification.metrics;
            print(metrics.pixels); // 当前位置
            print(metrics.atEdge); // 是否在顶部或底部
            print(metrics.axis); // 垂直或水平滚动
            print(metrics.axisDirection); // 滚动方向是up还是down
            print(metrics.extentAfter); // 视口底部距离列表底部有多大
            print(metrics.extentBefore); // 视口顶部距离列表顶部有多大
            print(metrics.extentInside); // 视口范围内的列表长度
            print(metrics.maxScrollExtent); // 最大滚动距离, 列表长度-视口长度
            print(metrics.minScrollExtent); // 最小滚动距离
            print(metrics.viewportDimension); // 视口长度
            print(metrics.outOfRange); // 是否越过边界
            print("----------------------------");
            return ture;
          }
        },
        child: ListView.builder(
          itemExtent: 50,
          itemCount: 50,
          itemBuilder: (BuildContext context, int index){
            return ListTile(title: Text(index.toString()));
          }
        )
      )
    );
  }
}