是否可以在NotificationListener

时间:2020-03-02 11:01:21

标签: flutter flutter-animation

我的页面上有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(),
                  ],
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

1 个答案:

答案 0 :(得分:0)

我没有发现任何检测滚动源的方法。因此,我只是将每个可滚动的子项包围在其自己的NotificationListener中。我不希望任何子级滚动一直冒泡,因为我只希望父级scrollView通知冒起气泡。所以,我给每个孩子包了:

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