首页 > 解决方案 > 是否可以在 NotificationListener 中检测 ScrollNotification 的来源

问题描述

我的页面中有 4 个可滚动小部件,1 个垂直(主)和 3 个水平。

和 2 个可滚动小部件(1 个垂直和 1 个水平)触发背景视差动画。

我如何检测哪个 Scrollable 小部件正在调度 ScrollNotification。

这是示例:

class MYPage extends StatefulWidget {
  MYPage({Key key}) : super(key: key);

  @override
  _MYPageState createState() => _MYPageState();
}

class _MYPageState extends State<MYPage> {
  double scrollX = 0.0;
  double scrollY = 0.0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        fit: StackFit.expand,
        children: <Widget>[
          ParallaxBackground(scrollX, scrollY),
          Positioned.fill(
            child: NotificationListener<ScrollNotification>(
              onNotification: (notification) {
                double scrollOffset = notification.metrics.pixels;
                setState(() {
                  if (notification.metrics.axis == Axis.horizontal) {
                    this.scrollX = scrollOffset;
                  } else {
                    this.scrollY = scrollOffset;
                  }
                });
                return true;
              },
              child: SingleChildScrollView(
                child: Column(
                  children: <Widget>[
                    Content(),
                    HorizontalScrollableContent(),
                    Content(),
                    HorizontalScrollableContentWithParallaxControl(),
                    Content(),
                    HorizontalScrollableContent(),
                    Content(),
                  ],
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

标签: flutterflutter-animation

解决方案


我没有注意到任何检测卷轴来源的方法。所以,我只是将每个可滚动的子对象包围在它自己的 NotificationListener 中。我不希望任何子滚动条一直冒泡,因为我只想让父滚动视图通知冒泡。所以,我用:

NotificationListener<ScrollNotification>(
    onNotification: (boolval) { return true; },
    child: ScrollableChildOfChoice()
)

推荐阅读