【问题标题】:Using a NestedScrollView and supplying a ScrollController downstream to a ListView使用 NestedScrollView 并向 ListView 下游提供 ScrollController
【发布时间】:2018-09-28 02:29:00
【问题描述】:

我有一个NestedScrollView,当我使用SliverAppBar 时,它可以很好地自动隐藏AppBar(我想要的一个功能)。我遇到问题的地方是我使用ListView.Builder 作为下游的身体组件之一,我需要将它自己的ScrollController 应用到(或者似乎我需要在这里应用它)。这与NestedScrollView 冲突,我失去了由NestedScrollViewSliverAppBar 方便处理的应用程序栏的自动隐藏。

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

这是我的实现的 sn-p/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, ....);
    }
}

这方面的好处是 PageView2 和 3 表现得很好,因为我没有在那里创建 ScrollControllers,所以在滚动行为上自动隐藏了应用栏。但是,PageView1 行为不正确,并且 appbar 的 autoHide 中断。但是,我真的希望能够正确地进行动画制作,并且如果不将控制器直接放在 ListViewBuilder 上就无法做到这一点。

有什么想法可以帮助我实现这一目标吗?

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

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

【问题讨论】:

  • 上面的例子只是将父控制器paasing到子页面,并且只适用于180像素,当我滚动子列表时,它不再更新,分享你的代码[删除你的凭证后代码]会有所帮助
  • 您找到解决方案了吗?我有确切的问题。我想控制NestedScrollView下的内部可滚动小部件?

标签: flutter


【解决方案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,
        ),
      ),
    ],
  )),
);

【讨论】:

  • 我确实尝试过使用 SliverList ...但不是在 SafeArea 内。我会试试看的。
  • 我试过了。 :( 仍然只是从我的控制器获取外部滚动位置。
  • 您是否将 SliverList 包装在 CustomScrollView 中?
  • 是的。如果我将SliverList 移动到NestedScrollView -> headerSliverBuilder 中,当您滚动到AppBar 之外时,确实可以捕获偏移量。那时我还没有添加回 JumpTo/AnimateTo。但是因为我现在至少可以看到控制器在 Scrollable 内容上的位置,所以我希望它可以工作。
猜你喜欢
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 2020-04-09
  • 2020-08-29
  • 2021-12-21
  • 2020-03-05
  • 1970-01-01
相关资源
最近更新 更多