Flutter 中使用 Slivers 实现复杂的滚动

https://vijay-r.medium.com/fancy-scrolls-in-flutter-using-slivers-514eed90bddf

前言

在本文中,我们将讨论如何在我们的 flutter 应用程序中使用 Sliver widget 实现花哨的滚动。

正文

我们将尝试使用 CustomScrollView 和条子实现以下滚动。

1)创建 CustomScrollView widget :

让我们首先创建一个 CustomScrollView widget ,该 widget 将获取一个条形 widget 列表。每个条对应于单独的组件,如应用程序栏、搜索栏和列表视图。

return const Scaffold(
      body: CustomScrollView(
        slivers: [
          SliverAppBarBldr(), // <- corresponds to the top most image
          SliverSearch(), // <- corresponds to search bar widget
          SliverListBldr(), //  <- corresponds to the body lists containers
        ],
      ),
    );

2)定义组件

现在让我们从逐个定义单个组件开始,

→ SliverAppBarBldr()

这个类使用 SliverAppBar widget 来构建顶部提供的图像。

class SliverAppBarBldr extends StatelessWidget {
  const SliverAppBarBldr({
    Key? key,
  }) : super(key: key);

  
  Widget build(BuildContext context) {
    return SliverAppBar(
      backgroundColor: Theme.of(context).scaffoldBackgroundColor,
      elevation: 0,
      pinned: true,
      centerTitle: false,
      stretch: true,
      expandedHeight: 300.0,
      flexibleSpace: const FlexibleSpaceBar(
        stretchModes: [StretchMode.zoomBackground],
        background: Image(
          image: AssetImage('assets/Images/feature.png'),
          fit: BoxFit.cover,
        ),
      ),
    );
  }

→ SliverSearch()

这个类使用 SliverAppBar widget 来构建搜索栏 widget 。

class SliverSearch extends StatelessWidget {
  const SliverSearch({
    Key? key,
  }) : super(key: key);

  
  Widget build(BuildContext context) {
    return SliverAppBar(
      backgroundColor: Theme.of(context).scaffoldBackgroundColor,
      elevation: 0,
      pinned: true,
      bottom: const PreferredSize(
          preferredSize: Size.fromHeight(-10.0), child: SizedBox()),
      flexibleSpace: const SearchBar(),
    );
  }
}

→ SliverListBldr()

这个类使用 SliverList widget 来构建 container 列表。

class SliverListBldr extends StatelessWidget {
  const SliverListBldr({
    Key? key,
  }) : super(key: key);

  
  Widget build(BuildContext context) {
    return SliverList(
      delegate: SliverChildBuilderDelegate(
        (BuildContext context, int index) {
          return Padding(
            padding: EdgeInsets.only(left: kSpacing, bottom: 20, right: 10),
            child: Container(
              decoration: BoxDecoration(
                borderRadius: kBorderRadius,
                color: secondaryColor.withOpacity(0.3),
              ),
              height: 200,
              width: MediaQuery.of(context).size.width,
            ),
          );
        },
        childCount: 20,
      ),
    );
  }
}

就是这样,运行代码查看它的运行情况

代码

https://github.com/vijayinyoutube/elastic_slivers_app

结束语

如果本文对你有帮助,请转发让更多的朋友阅读。

也许这个操作只要你 3 秒钟,对我来说是一个激励,感谢。

祝你有一个美好的一天~

猫哥课程


© 猫哥

  • 微信 ducafecat

  • https://wiki.ducafecat.tech

  • https://ducafecat.com

Last Updated:
Contributors: ducafecat