如何在 Flutter 中滚动带有粘性标题的堆叠容器?

Posted

技术标签:

【中文标题】如何在 Flutter 中滚动带有粘性标题的堆叠容器?【英文标题】:How to scroll stacked containers with sticky header in Flutter? 【发布时间】:2021-03-25 20:53:43 【问题描述】:

我正在尝试在 Flutter Web 中实现滚动,其中堆叠的容器很少,我使用 SingleChildScrollView 滚动小部件。但是,当我滚动第一个容器时,一切正常,但第二个容器的子容器响应滚动而没有完成初始容器。还有一种方法可以为第二个容器制作一个粘性标题。在第二个(蓝色)完成滚动后,如何使第三个容器(橙色)滚动?这是我想要实现的目标: https://yobithemes.com/demo/html/freda/dark-video-index.html

到目前为止我得到了什么:

class MainScreen extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: Stack(
        children: <Widget>[
          IntroScreen(),
          SingleChildScrollView(
            child: Container(
              child: Column(
                children: <Widget>[
                  SizedBox(
                    height: MediaQuery.of(context).size.height - 100,
                  ),
                  Container(
                    height: MediaQuery.of(context).size.height,
                    width: MediaQuery.of(context).size.width,
                    color: Colors.blue,
                    child: SingleChildScrollView(
                      child: Column(
                        children: [
                          SizedBox(
                            height: MediaQuery.of(context).size.height,
                          ),
                          Container(
                            padding: EdgeInsets.only(top: 100),
                            height: MediaQuery.of(context).size.height,
                            width: MediaQuery.of(context).size.width,
                            color: Colors.orange,
                          ),
                        ],
                      ),
                    ),
                  ),
                ],
              ),
            ),
          ),
        ],
      ),
    );
  

【问题讨论】:

【参考方案1】:

你可以通过使用 sliver 来实现它。

SliverToBoxAdapter屏幕高度-应用栏高度填充透明区域。

SliverAppBar:通过将 floatingpin 设置为 true 来使其具有粘性

class MainScreen extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: Stack(
        children: <Widget>[
          IntroScreen(),
          CustomScrollView(
            slivers: [
              SliverToBoxAdapter(
                child: Container(
                  height: MediaQuery.of(context).size.height - 50,
                ),
              ),
              SliverAppBar(
                // toolbarHeight: 50,
                floating: true,
                pinned: true,
                title: Container(
                  child: Center(child: Text('Header')),
                ),
              ),
              SliverList(
                delegate: SliverChildBuilderDelegate(
                  (context, index) => Container(
                    height: MediaQuery.of(context).size.height-50,
                    color: Colors.primaries[index % Colors.primaries.length],
                  ),
                ),
              ),
            ],
          ),
        ],
      ),
    );
  

【讨论】:

以上是关于如何在 Flutter 中滚动带有粘性标题的堆叠容器?的主要内容,如果未能解决你的问题,请参考以下文章

带有滚动背景的粘性标题

集合视图单元格内容是分层的

带有平滑滚动的粘性导航正在跳跃

iOS - 带有内容插入的粘性标题 - 标题视图不像单元格那样滚动

使用粘性导航栏自动滚动 Flexbox 列

标题中的粘性导航栏[关闭]