首页 > 其他分享 >Sliver组件使用示例

Sliver组件使用示例

时间:2024-07-08 22:54:59浏览次数:11  
标签:index const 示例 SliverList SliverGrid 内容 组件 Sliver

文章目录


我们在上一章回中介绍了SliverPadding组件相关的内容,本章回中将介绍Sliver综合示例.闲话休提,让我们一起Talk Flutter吧。

在这里插入图片描述

1. 概念介绍

我们在前面的章回中介绍了各种Sliver相关的组件:SliverList,SliverGrid,SliverAppBar和SliverPadding,本章回将综合使用它们。下面是示例程序的
运行效果图。不过在使用之前还需要介绍一个新组件:CustomScrollView。该组件相当于一个粘合剂,它可以把各个Sliver组件组合在一起。010slivers

2. 使用方法

和其它组件类似,该组件提供了相关的属性来控制自己,
下面是该组件中常用的属性,掌握这些属性后就可以使用该组件了。

  • scrollDirection属性:主要用来控制列表中滚动方向;
  • controller属性:主要用来控制某个列表的位置;
  • slivers属性:主要用来存放Sliver相关的组件,它的用法类似Column组件中的children属性;
    介绍完这些常用属性后,我们将在后面的小节中通过具体的示例代码来演示它的使用方法。

3. 示例代码

CustomScrollView(
  slivers: [
    SliverAppBar(
      title: const Text('Title of SliverAppBar'),
      backgroundColor: Colors.purpleAccent,
      ///关闭和展开时的高度
      collapsedHeight: 60,
      expandedHeight: 300,

      ///appBar空间扩展后显示的内容
      flexibleSpace: FlexibleSpaceBar(
        ///这个title在appBar的最下方,可以不设定,缩小后它会和SliverAppBar的title重合
        title: const Text('title of FlexibleSpaceBar'),
        background: Container(
          decoration: const BoxDecoration(
            image:DecorationImage(
              opacity: 0.8,
              image: AssetImage("images/ex.png"),
              fit: BoxFit.fill,
            ),
          ),
          ///扩展空间中主要显示的内容
          child: const Center(child: Text('child of container')),
        ),
        centerTitle: true,
        ///拉伸和折叠时的样式,效果不是很明显
        collapseMode: CollapseMode.pin,
        stretchModes: const [
          StretchMode.zoomBackground,
          StretchMode.blurBackground,
          StretchMode.fadeTitle,
        ],
      ),
    ),
    ///SliverAppBar下方显示的内容,这个需要和SliverAppBar一起添加,否则不会出现滑动效果
    ///这个只是一个简单的SliverList,用来配合SliverAppBar使用,真正的介绍在下面的程序中
    SliverList(
      delegate: SliverChildListDelegate(
      // List.generate(40, (index) => Icon(Icons.recommend),),
      List.generate(5, (index) => Text('Item ${index+1}'),),
      ),
    ),
    ///SliverGrid和工厂方法
    SliverGrid.count(
      ///交叉轴显示内容的数量,这里相当于3列
      crossAxisCount: 3,
      ///主轴上显示内容的空间设置,相当于行距
      mainAxisSpacing: 10,
      ///交叉轴上显示内容的空间设置,相当于列距
      crossAxisSpacing: 10,
      childAspectRatio: 1.2,
      ///Grid中显示的内容,一共9个自动换行,分3行显示
      children:List.generate(9, (index) {
        return Container(
          alignment: Alignment.center,
          ///使用固定颜色和随机颜色
          // color: Colors.redAccent,
          // color:Colors.primaries[index%5],
          ///修改为圆角,颜色移动到圆角中
          decoration: BoxDecoration(
            color: Colors.primaries[index%5],
            borderRadius: BorderRadius.circular(20),
          ),
          child: Text('item: $index'),
        );
      }).toList(),
    ),
    ///不使用工厂方法,直接使用SliverGrid的构造方法
    SliverGrid(
      ///Grid中显示的内容,可以使用BuilderDelete直接创建显示内容,或者使用已经有的list
      delegate: SliverChildBuilderDelegate((context,index){
        return const Icon(Icons.face_3_outlined); },
      childCount: 20,
      ),
      ///配置Grid的相关属性,
      gridDelegate:const SliverGridDelegateWithFixedCrossAxisCount(
        ///主轴上显示内容的空间设置,相当于行距
        mainAxisExtent: 20,///这个值不能小于显示内容,否则最后一行的内容会被遮挡
        mainAxisSpacing: 20,
        ///交叉轴显示内容的数量,这里相当于4列
        crossAxisCount: 4,
        ///交叉轴上显示内容的空间设置
        crossAxisSpacing: 20,
        ///显示内容的宽高比
        childAspectRatio: 1.2,
      ),
    ),
    ///不使用工厂方法,直接使用SliverGrid的构造方法,和上一个类似,只是创建显示内容的方法不同
    SliverGrid(
      ///Grid中显示的内容,可以使用BuilderDelete直接创建显示内容,或者使用已经有的list
      delegate: SliverChildListDelegate(
        List.generate(20,
              (index) => const Icon(Icons.camera,color: Colors.blue,),),
      ),
      ///配置Grid的相关属性,同上。不同之处在于交叉轴显示内容的数量不固定,而是与空间有关
      gridDelegate:const SliverGridDelegateWithMaxCrossAxisExtent(
        maxCrossAxisExtent: 40,
        mainAxisExtent: 40,
        mainAxisSpacing: 20,
        crossAxisSpacing: 5,
        childAspectRatio: 1.6,
      ),
    ),
    ///SliverList,可以理解为对ListView的封装,以便用于Sliver中创建delegate对象,使用builder方法。
    SliverList(
      delegate: SliverChildBuilderDelegate((context,index){
        return Container(
          height: 60,
          alignment: Alignment.center,
          child: Text('This is ${index+1} item'),
        );
      },
        ///list的数量
        childCount:5,
      ),
    ),
    ///与上面的SliverList类似,只是不有创建delegate对象,而是直接使用现成的list对象
    SliverList(
      delegate: SliverChildListDelegate(
        List.generate(5, (index) => const Icon(Icons.add),),
      ) ,
    ),
    ///调整显示内容的边距,在上下左右四个方向添加,SliverList,SliverList效果不明显
    SliverPadding(
     ///在上下左右四个方向上添加边距
     // padding: EdgeInsets.only(left: 10,right: 10),
     padding: const EdgeInsets.all(10),
     sliver:SliverList(
       delegate:SliverChildListDelegate(
         List.generate(5,
               (index) => Container(
                 color: Colors.grey,
                 child: Text('Item ${index+1}'),
               ),
         ),
       ) ,
     ) ,
    ),
    ///调整显示内容的边距,在上下左右四个方向添加,配合Grid内部的边距效果比较明显
    SliverPadding(
      padding: const EdgeInsets.all(10),
      sliver: SliverGrid.count(
        mainAxisSpacing: 10,
        crossAxisCount: 4,
        crossAxisSpacing: 10,
        children: List.generate(9, (index) => Container(
          alignment: Alignment.center,
          color: Colors.primaries[index%5],
          child: Text('Item ${index+1}'),
        ),) ,
      ),
    ),
  ],
),

上面是的代码中使用了前面章回中介绍过的所有与Sliver相关的组件,整个界面的外层使用CustomScollView当作容器,容器里的组件全部是SliVer相关的组件,最
上方是SliverAppBar组件,它下面是SliverList和SliverGrid组件,向上滑动时SliverBar会被折叠,SliverList和SliverGrid会跟着一起滚动,不过它们
是做为一个整体来滚动而不是像ListView中一个条目,一个条目地滚动。具体的滚动效果可以看开篇的程序运行效果图。这个程序中包含的内容比较多,单是SliverList
就有好几个,大家可以对比着看,建议大家自己动手去实践,这样可以真正体会到SliverList等组件的功能,以及它们包含的细节。
看官们,与"Sliver综合示例"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

标签:index,const,示例,SliverList,SliverGrid,内容,组件,Sliver
From: https://blog.csdn.net/talk_8/article/details/140280731

相关文章

  • 谷粒商城学习笔记-2-分布式组件-SpringCloud Alibaba-Nacos注册中心
    文章目录一,Nacos简介1,简介2,Nacos原理剖析二,Nacos服务端安装1,下载nacos-server2,解压启动nacos-server3,验证三,服务注册步骤1,引用Nacas客户端的Jar包2,服务启动类增加注解3,配置Nacos服务器地址四,验证错误记录一,Nacos简介1,简介Nacos是阿里巴巴开源的一个更易于构建云......
  • vk-data-goods-sku-popup uniapp vue3示例
    效果图组件简介vk-data-goods-sku-popup是一个uniapp上面方便好用的sku组件,使用场景包括但不限于商品详情页、购物车页面、订单结算页、搜索结果页下面就上代码了,完整vue页面的代码如下<scriptsetup>import{ref,defineEmits,defineProps,computed}from'vue'//显示......
  • Nuxt框架中内置组件详解及使用指南(三)
    title:Nuxt框架中内置组件详解及使用指南(三)date:2024/7/8updated:2024/7/8author:cmdragonexcerpt:摘要:“Nuxt3框架中与组件的深度使用教程,包括如何使用这两个组件进行页面导航和加载指示的自定义配置与实战示例。”categories:前端开发tags:Nuxt3组件NuxtL......
  • linux下更改进程为daemon的示例代码
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档linux下更改进程为daemon的示例代码前言使用chatgpt生成了一个更改进程为daemon的代码,无参函数,调用后直接更改进程为daemonchatgpt:通义千问,文心一言提示:以下是本篇文章正文内容,下面案例可供参考一、da......
  • SpringBoot集成Kafka快速启动示例
    源码地址:https://github.com/ghdefe/kafka-demokafka消息发送接收示例1.启动kafka实例cat<<EOF>docker-compose.ymlversion:"2"services:zookeeper:image:docker.io/bitnami/zookeeper:3.8ports:-"2181:2181"-"......
  • Vue3中drawer组件无法重新回显数据
    不做drawer的时候数据是可以正常回显的,点击详情id是正常传值的,但是使用了drawer组件以后发现只会调用一次详情功能,以后不管点击哪条信息都不会刷新信息永远都是第一条的信息,但是id刷新成功了,后来发现是没有加v-if来判断drawer的打开值,如果您有一样的问题可以参考以下代码......
  • 04、组件介绍
    k8s里的资源对象在k8s里,yaml用来声明API对象的,那么API对象都有哪些?可以这样查看资源对象kubectlapi-resourcesyaml使用缩进表示层次,缩进不允许使用tab,只能用空格,缩进空格数多少不要求,只要保证同一层级空格数一样多即可使用#书写注释数组(列表)是使用-开头的清单形式对......
  • AI绘画Stable Diffusion:ControlNet组件—Scribble(涂鸦)赋予用户精细控制权,让涂鸦草图焕
    大家好,我是画画的小强今天给大家分享一下AI绘画StableDiffusion当中的:ControlNetScribble组件,**Scribble(涂鸦)**技术是一种能够为用户提供独特的手动注释或标记图像(如:涂鸦、简笔画等)的方法技术,可被用来引导SD图像生成过程。ControlNetScribble简介ControlNetScribble......
  • Unity入门之重要组件和API(3) : Transform
    前言Transform类主要处理游戏对象(GameObject)的位移、旋转、缩放、父子关系和坐标转换。1.位置和位移1.1必备知识点:Vector3Vector3主要用来表示三维坐标系中的一个点或者一个向量。【声明】Vector3v1=newVector3();Vector3v2=newVector3(10,10);Vector3v3......
  • React+TS前台项目实战(二十六)-- 高性能可配置Echarts图表组件封装
    文章目录前言CommonChart组件1.功能分析2.代码+详细注释3.使用到的全局hook代码4.使用方式5.效果展示总结前言Echarts图表在项目中经常用到,然而,重复编写初始化,更新,以及清除实例等动作对于开发人员来说是一种浪费时间和精力。因此,在这篇文章中,将封装一个“高......