ScrollController附加时的事件

时间:2018-04-04 21:43:20

标签: dart flutter

一旦我掌握了有关最大滚动范围的信息,我就试图显示一个小部件。如果我将ScrollController的实例分配给可滚动小部件的controller属性,我可以找到该数字。

我的问题是ScrollController在构建期间附加到可滚动窗口小部件,因此我无法在第一次构建之前使用最大滚动范围编号。因此,我尝试做的是在第一个构建中显示一个空的Container,然后用我真正想要的小部件切换那个空的Container。像这样:

    _scrollController.positions.length == 0 ? new Container() : new Align(
      alignment: Alignment.center,
      child: new Container(
        width: constraints.maxWidth,
        height: 50.0,
        color: Colors.black,
      )
    )

现在这当然不起作用,因为_scrollController.positions.length在开始时将为0,当此值发生变化时(控制器连接时),我无处调用setState
所以我的问题:每当ScrollController附加到可滚动窗口小部件时,我是否可以收到通知?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

如果滚动条是Note: -webkit-app-region: drag is known to have problems while the developer tools are open. See this GitHub issue for more information including a workaround.

widget.child

孩子必须@override Widget build(BuildContext context) { return new NotificationListener<ScrollNotification>( onNotification: _handleScrollNotification, child: widget.child, ); } bool _handleScrollNotification(ScrollNotification notification) { if (notification is ScrollUpdateNotification || notification is OverscrollNotification) { widget.child.update(notification.metrics); } return false; } @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) => afterFirstLayout(context)); } void afterFirstLayout(BuildContext context) { applyInitialScrollPosition(); } void applyInitialScrollPosition() { ScrollController scrollControler = widget.child.controller; ScrollPosition position = scrollControler.position; ScrollNotification notification = ScrollUpdateNotification( metrics: FixedScrollMetrics( minScrollExtent: position.minScrollExtent, maxScrollExtent: position.maxScrollExtent, pixels: position.pixels, viewportDimension: position.viewportDimension, axisDirection: position.axisDirection), context: null, scrollDelta: 0.0); _handleScrollNotification(notification); } 并具有extends ChangeNotifier方法:

update

只有在为可滚动对象(widget.child)明确定义了滚动控制器的情况下,所有这些方法才有效。