flutter - 使用 NestedScrollView 并向 ListView 下游提供 ScrollController

标签 flutter

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

如果我在 NestedScrollView 上附加 ScrollController 那么它只跟踪滚动位置直到偏移 80.0 之后,使用更长的 ListView 我无法正确animateTo 我可以使用直接附加到 ListView.Builder 的 ScrollController。

这是我的实现的片段/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 中断。但是,我真的希望能够正确地进行动画处理,并且如果不将 Controller 直接放在 ListViewBuilder 上就无法这样做。

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

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

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

最佳答案

关注NestedScrollViewExample :

将您的 ListView 更改为 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,
        ),
      ),
    ],
  )),
);

关于flutter - 使用 NestedScrollView 并向 ListView 下游提供 ScrollController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49889673/

相关文章:

Flutter:显示分钟和秒的倒数计时器

android - 尝试注册用户时出现错误

flutter - flutter 测试文件重要吗?

Flutter get_it 和 FutureBuilder 不适用于热重载

firebase - 如何使用 flutter 和 firebase 将 'Read' 功能添加到消息传递应用程序中

flutter 错误 : Could not download bcprov-jdk15on. jar (org.bouncycaSTLe :bcprov-jdk15on:1. 56)

dart - Flutter中 'Failed assertion: boolean expression must not be null'异常如何解决

flutter - 如何在 flutter pub 升级时自动更新 pubspec.yaml?

android - 在 flutter 中加载自定义 ML 模型时出错

flutter - 方法 'registerMessageHandler' 没有为类型 'Registrar' 定义