使用NestedScrollView并将ScrollController下游提供给ListView

use*_*752 7 flutter

我使用时NestedScrollView可以很好地自动隐藏AppBar(我想要的一个功能)SliverAppBar。在遇到问题的地方,我将其ListView.Builder用作身体下游组件之一,我需要将其应用于自身ScrollController(或似乎需要在此处应用)。这与NestedScrollView和冲突,我失去了由NestedScrollView和方便处理的appbar的自动隐藏SliverAppBar

如果我将附加在ScrollController上,NestedScrollView则它将仅跟踪滚动位置直到偏移量80.0,之后,使用更长的ListView,我无法像直接将ScrollController附加到那样正确地设置animateTo ListView.Builder

这是我的实现的代码片段/ sudo代码:

new Scaffold(
    drawer: ...,
    body: new NestedScrollView(
        headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
            return [
                new SliverAppBar(
                    title: new Text('Title'),
                    floating: true,
                    snap: true
                )
            ]
        }
        body: new Stack(
            children: <Widget>[
                new PageView(
                    children: <Widget>[
                        new PageView1(implements ListViewBuilder),
                        new PageView2(implements ListView),
                        new PageView3(implements ListView),
                    ]
                    controller: _pageController,
                ),
                new FloatingActionButton
            ]
        )
    )
)

class PageView1 extends StateFulWidget {
    ...//Builder return scrollable with max offset of 2000.0
        return new ListView.builder(
        itemBuilder: itemBuilder,
        itemCount: objects.length,
        controller: _scrollController,
        );
    ...

    @override
    void initState{
        scrollController = new scrollController();
        scrollController.animateTo(800.0, ....);
    }
}
Run Code Online (Sandbox Code Playgroud)

与此有关的一个好地方是PageView2和3的表现很好,因为应用程序栏的自动隐藏功能可实现滚动行为,因为我没有在那里创建ScrollControllers。但是,PageView1的行为不正确,appbar的autoHide中断了。但是,我真的希望能够正确设置animateTo,并且如果不将控制器直接放在ListViewBuilder上就无法这样做。

对更好的实现有什么想法可以帮助我实现这一目标?

更新:我已经更新了实现,以更紧密地遵循NestedScrollView文档。但是,没有运气。看来NestedScrollView上ScrollController的添加仅跟踪SliverAppBar的位置,而ScrollController.jumpTo或animateTo仅跳至最大AppBar(偏移80)

我解决了。这根本不是我期望的那样。我将SliverList移到headerSliv​​erBuilder中,并且按我想要的方式工作。我从这个NestedScrollView示例要点中做到了这一点:https ://gist.github.com/collinjackson/2bc6697d31e6b94ada330ef5e818a36f

Ian*_*Ian 1

按照NestedScrollViewExample进行操作:

将列表视图更改为 SliverList 或 SliverFixedExtentList 并将其包装在安全区域和 CustomScrollView 内:

return SafeArea(
  top: false,
  bottom: false,
  child: Builder(builder: (BuildContext context) => CustomScrollView(
    slivers: <Widget>[
      return SliverFixedExtentList(
        itemExtent: 100.0,
        delegate: SliverChildBuilderDelegate(
          (BuildContext context, int i) => ChildWidget(items[i]),
          childCount: items.length,
        ),
      ),
    ],
  )),
);
Run Code Online (Sandbox Code Playgroud)