【问题标题】:Flutter vertical PageView issue with SliverAppBarSliverAppBar 的 Flutter 垂直 PageView 问题
【发布时间】:2021-05-01 22:20:27
【问题描述】:

我需要有垂直PageView的滑动效果和SliverAppBar的效果。

如果我设置 PageView.builderscrollDirection: Axis.vertical 并垂直滑动,当我向后滑动时,我无法获得 SliverAppBar。

设置 scrollDirection: Axis.horizo​​ntal SliverAppBar 可以工作,但如前所述,我需要它垂直。

我还没有找到任何好的方法来解决这个问题,你能帮我理解一下吗? 我的最终目标是拥有第一个带有按钮的“屏幕”(这就是我使用 SliverAppBar 的原因),下一个屏幕将是全屏图片库。如果您有更好的不使用 Slivers 或 PageView 的解决方案,请告诉我。

     @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: NestedScrollView(
        controller: _scrollController,
        headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
          return <Widget>[
            SliverAppBar(
              expandedHeight: MediaQuery.of(context).size.height*0.85,
              flexibleSpace: FlexibleSpaceBar(
                background: Image.network(
                  'https://source.unsplash.com/random?monochromatic+dark',
                  fit: BoxFit.cover,
                ),
                title: Padding(
                  padding: const EdgeInsets.only(left: 10.0),
                  child: Row(
                    children: [
                      ElevatedButton(
                          onPressed: () => print('btn1'),
                          child: Text('Button 1')),
                      ElevatedButton(
                          onPressed: () => print('btn2'),
                          child: Text('Button 2')),
                    ],
                  ),
                ),
              ),
            ),
          ];
        },
        body: _pageView(),
      ),
    );
  }

  _pageView() {
    return PageView.builder(
      scrollDirection: Axis.horizontal,
      itemCount: 20,
      itemBuilder: (BuildContext context, int index) {
        return Card(
          child: Container(
            padding: EdgeInsets.all(16.0),
            child: Image.network(
              'https://source.unsplash.com/random?sig=$index',
              fit: BoxFit.cover,
            ),
          ),
        );
      },
    );
  }
}

如果您想查看完整示例或在您身边进行测试: https://pastebin.com/PXDHVw6k

【问题讨论】:

    标签: flutter dart


    【解决方案1】:
    1. SliverAppBar之前添加SliverOverlapAbsorber
    NestedScrollView(
                  headerSliverBuilder:
                      (BuildContext context, bool innerBoxIsScrolled) {
                    return <Widget>[
                      SliverOverlapAbsorber(
                        handle: NestedScrollView.sliverOverlapAbsorberHandleFor(
                            context),
                        sliver: SliverAppBar(
    ...
                        ),
                      ),
                    ];
                  },
                  body: _pageView(),
                ),
    
    1. 使用custom scroll wheel 并使用sliver.list 代替pageview 并将physics: PageScrollPhysics() 添加到custom scroll wheel 以获得与页面浏览量相同的页面snapping effect
    CustomScrollView(
                  physics: PageScrollPhysics(),
                  slivers: <Widget>[
                    SliverList(
                      delegate: SliverChildBuilderDelegate(
                        (context, index) {
                          return ... ;
                        },
                        childCount: ...,
                      ),
                    ),
                  ],
                ),
    

    【讨论】:

    • 当时我解决了这个问题。但是感谢 Zahra,您的回复可能对其他人有用。
    • 嘿,理查德。如果您解释如何解决它,将不胜感激?顺便说一句,如果您在此处添加解决方案作为答案,可能对其他人有帮助!谢谢
    • 我不喜欢 sliver 效果,所以我最终只使用 PageView.builder 来显示我的内容。
    • 应用栏呢?你把它完全删除了吗?
    • 是的,我没有使用 appBar。这是一个图片库。没有 appbar 看起来更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2020-02-04
    • 2019-02-20
    • 2021-10-28
    • 2020-11-15
    • 2021-04-04
    • 2020-02-14
    相关资源
    最近更新 更多