Flutter 中 Sliver 的各种装饰器介绍与使用
在 Flutter 中,Sliver 是一种可以在滚动视图中实现自定义效果的组件。Sliver 组件可以根据滚动位置动态改变其外观和行为。本文将介绍几种常用的 Sliver 装饰器及其使用方法。
1. SliverAppBar
SliverAppBar 是一个可以随着滚动而变化的应用栏。它可以在用户向下滚动时收缩,向上滚动时展开。
使用示例
import 'package:flutter/material.dart';class SliverAppBarExample extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(body: CustomScrollView(slivers: <Widget>[SliverAppBar(expandedHeight: 200.0,flexibleSpace: FlexibleSpaceBar(title: Text('SliverAppBar Example'),background: Image.network('https://example.com/image.jpg',fit: BoxFit.cover,),),floating: false,pinned: true,),SliverList(delegate: SliverChildBuilderDelegate((BuildContext context, int index) {return ListTile(title: Text('Item #$index'));},childCount: 100,),),],),);}
}
2. SliverList 和 SliverGrid
SliverList 和 SliverGrid 用于创建可滚动的列表和网格。它们可以与 CustomScrollView 一起使用,以实现更复杂的滚动效果。
使用示例
import 'package:flutter/material.dart';class SliverListExample extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(body: CustomScrollView(slivers: <Widget>[SliverList(delegate: SliverChildBuilderDelegate((BuildContext context, int index) {return ListTile(title: Text('List Item #$index'));},childCount: 50,),),SliverGrid(gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2,),delegate: SliverChildBuilderDelegate((BuildContext context, int index) {return Card(child: Center(child: Text('Grid Item #$index')),);},childCount: 50,),),],),);}
}
3. SliverToBoxAdapter
SliverToBoxAdapter 是一个适配器,可以将普通的 Widget 转换为 Sliver。它可以用于在 Sliver 组件中插入非 Sliver Widget。
使用示例
import 'package:flutter/material.dart';class SliverToBoxAdapterExample extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(body: CustomScrollView(slivers: <Widget>[SliverToBoxAdapter(child: Container(height: 100.0,color: Colors.blue,child: Center(child: Text('Non-Sliver Widget')),),),SliverList(delegate: SliverChildBuilderDelegate((BuildContext context, int index) {return ListTile(title: Text('Item #$index'));},childCount: 50,),),],),);}
}
4. SliverPersistentHeader
SliverPersistentHeader 允许你创建一个可以在滚动时保持可见的头部。它可以用于实现自定义的滚动效果。
使用示例
import 'package:flutter/material.dart';class SliverPersistentHeaderExample extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(body: CustomScrollView(slivers: <Widget>[SliverPersistentHeader(pinned: true,delegate: _SliverAppBarDelegate(minHeight: 60.0,maxHeight: 200.0,child: Container(color: Colors.red,child: Center(child: Text('Persistent Header')),),),),SliverList(delegate: SliverChildBuilderDelegate((BuildContext context, int index) {return ListTile(title: Text('Item #$index'));},childCount: 50,),),],),);}
}class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {_SliverAppBarDelegate({required this.minHeight,required this.maxHeight,required this.child,});final double minHeight;final double maxHeight;final Widget child;Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) {return SizedBox.expand(child: child);}bool shouldRebuild(_SliverAppBarDelegate oldDelegate) {return minHeight != oldDelegate.minHeight ||maxHeight != oldDelegate.maxHeight ||child != oldDelegate.child;}
}
5. SliverFixedExtentList
SliverFixedExtentList 用于创建具有固定高度的列表项,适合需要统一高度的列表。
使用示例
import 'package:flutter/material.dart';class SliverFixedExtentListExample extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(body: CustomScrollView(slivers: <Widget>[SliverFixedExtentList(itemExtent: 100.0, // 每个列表项的固定高度delegate: SliverChildBuilderDelegate((BuildContext context, int index) {return ListTile(title: Text('Fixed Item #$index'));},childCount: 50,),),],),);}
}
6. SliverPadding
SliverPadding 用于在 Sliver 组件周围添加内边距。
使用示例
import 'package:flutter/material.dart';class SliverPaddingExample extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(body: CustomScrollView(slivers: <Widget>[SliverPadding(padding: EdgeInsets.all(16.0), // 设置内边距sliver: SliverList(delegate: SliverChildBuilderDelegate((BuildContext context, int index) {return ListTile(title: Text('Padded Item #$index'));},childCount: 50,),),),],),);}
}
7. SliverGrid
SliverGrid 用于创建可滚动的网格布局,适合展示图片或其他网格状内容。
使用示例
import 'package:flutter/material.dart';class SliverGridExample extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(body: CustomScrollView(slivers: <Widget>[SliverGrid(gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, // 每行显示3个childAspectRatio: 1.0, // 宽高比),delegate: SliverChildBuilderDelegate((BuildContext context, int index) {return Card(child: Center(child: Text('Grid Item #$index')),);},childCount: 30,),),],),);}
}
8. SliverAppBar with TabBar
结合 SliverAppBar 和 TabBar 可以实现带有标签的可滚动应用栏。
使用示例
import 'package:flutter/material.dart';class SliverAppBarWithTabsExample extends StatelessWidget {Widget build(BuildContext context) {return DefaultTabController(length: 3,child: Scaffold(body: CustomScrollView(slivers: <Widget>[SliverAppBar(expandedHeight: 200.0,floating: false,pinned: true,flexibleSpace: FlexibleSpaceBar(title: Text('SliverAppBar with Tabs'),),bottom: TabBar(tabs: [Tab(text: 'Tab 1'),Tab(text: 'Tab 2'),Tab(text: 'Tab 3'),],),),SliverList(delegate: SliverChildBuilderDelegate((BuildContext context, int index) {return ListTile(title: Text('Item #$index'));},childCount: 100,),),],),),);}
}
9. SliverOpacity
SliverOpacity 用于在 Sliver 组件上应用透明度效果。
使用示例
import 'package:flutter/material.dart';class SliverOpacityExample extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(body: CustomScrollView(slivers: <Widget>[SliverOpacity(opacity: 0.5, // 设置透明度sliver: SliverList(delegate: SliverChildBuilderDelegate((BuildContext context, int index) {return ListTile(title: Text('Opacity Item #$index'));},childCount: 50,),),),],),);}
}
总结
Sliver 组件为 Flutter 提供了强大的滚动效果和灵活的布局方式。通过使用 SliverAppBar、SliverList、SliverGrid、SliverToBoxAdapter、SliverPersistentHeader、SliverFixedExtentList、SliverPadding、SliverOpacity 等组件,你可以创建出丰富多彩的用户界面。希望本文能帮助你更好地理解和使用 Flutter 中的 Sliver 装饰器。
相关文章:
Flutter 中 Sliver 的各种装饰器介绍与使用
在 Flutter 中,Sliver 是一种可以在滚动视图中实现自定义效果的组件。Sliver 组件可以根据滚动位置动态改变其外观和行为。本文将介绍几种常用的 Sliver 装饰器及其使用方法。 1. SliverAppBar SliverAppBar 是一个可以随着滚动而变化的应用栏。它可以在用户向下滚…...
电感的基本概念
电感的定义: 电感一般是由导线绕成空芯线圈或带铁芯的线圈而制成。 当线圈中有电流通过时,线圈周围就会产生磁场,当线圈中流过的是直流电流时,线圆周围就会产生固定的磁场,线圈产生的物理现象就是电磁铁,当…...
linux基于systemd自启守护进程 systemctl自定义服务傻瓜式教程
系统服务 书接上文: linux自启任务详解 演示系统:ubuntu 20.04 开发部署项目的时候常常有这样的场景: 业务功能以后台服务的形式提供,部署完成后可以随着系统的重启而自动启动;服务异常挂掉后可以再次拉起 这个功能在ubuntu系统中通常由systemd提供 如果仅仅需要达成上述的场…...
HTTP协议和接口测试详解
介绍接口测试前我们先来介绍一下HTTP协议,为什么先要介绍HTTP协议呢因为因为我们做接口测试其实就是用测试工具(postman,fiddler,jmeter等等)或代码来模拟用户使用软件的场景,在我们模拟的时候不像平时功能测试时我们有已经开发完…...
vue3【实战】定义全局方法(两种方案)
以全局方法 calculate 为例 src/utils/calculate.ts export default {sum: function (a: number, b: number) {return a b} }方案1: 依赖注入 provide inject main.ts import calculate from ./utils/calculateapp.provide(calculate, calculate)页面中 // esl…...
基于JavaScript的DBUtils增删改查操作实验
1、实验目的 学习和掌握数据库连接池的配置与管理。使用DBUtils进行增删改查操作。按照步骤,掌握并实现使用DBUtils实现增删改查的全过程。 2、实验所用方法 上机实践 3、实验步骤及截图 创建一个数据库表,使用下面sql语句创建数据库表并插入数据&#x…...
初学stm32 --- 系统时钟配置
众所周知,时钟系统是 CPU 的脉搏,就像人的心跳一样。所以时钟系统的重要性就不言而喻了。 STM32 的时钟系统比较复杂,不像简单的 51 单片机一个系统时钟就可以解决一切。于是有人要问,采用一个系统时钟不是很简单吗?为…...
实现星星评分系统
使用HTML、CSS和JavaScript实现星星评分系统 本文将详细讲解如何使用 HTML、CSS 和 JavaScript 实现一个简单的星星评分系统。用户可以通过点击星星进行评分,并且还能够看到星星的悬浮效果和已选中状态。 1. HTML 结构 我们首先在 HTML 中定义了一个星星评分的结…...
数据库建模工具 PDManer
数据库建模工具 PDManer 1.PDManer简介2.PDManer使用 1.PDManer简介 PDManer(元数建模)是一款功能强大且易于使用的开源数据库建模工具。它不仅支持多种常见数据库,如MySQL、PostgreSQL、Oracle、SQL Server等,还特别支持国产数据…...
后台运维操作建议
文章目录 1.版本升级2.配置发布3.数据库/脚本操作4.发布依赖确认5.发布规范6.服务下线参考文献 1.版本升级 版本升级是软件维护和演进中的关键环节,但它可能带来一系列问题。这些问题涉及兼容性、功能、性能、安全性等方面。 【强制】版本管理:使用版本…...
NX二次开发调用内部函数设置对象穿透显示DSS_ATTR_set_show_through
获取动态库libdisp.dll的路径 void TcharToChar(const TCHAR* tchar, char* _char) {int iLength; #if UNICODE//获取字节长度 iLength = WideCharToMultiByte(CP_ACP, 0, tchar, -1, NULL, 0, NULL, NULL);//将tchar值赋给_char WideCharToMultiByte(CP_ACP, 0, tchar, …...
ubuntu16.04ros-用海龟机器人仿真循线系统
下载安装sudo apt-get install ros-kinetic-turtlebot ros-kinetic-turtlebot-apps ros-kinetic-turtlebot-interactions ros-kinetic-turtlebot-simulator ros-kinetic-kobuki-ftdi sudo apt-get install ros-kinetic-rocon-*echo "source /opt/ros/kinetic/setup.bash…...
解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误
解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误 您在 Ubuntu 20.04 上编译 OpenCV 3.2 时遇到的错误与 C 标准库的头文件配置问题有关。错误消息指出系统无法找到 <stdlib.h>,这通常与预编译头文件的处理、GCC 版本或者头文件搜索路径有关。下面…...
HTML综合案例
为了前端考试。 效果图: HTML代码: <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...
TanStack——为现代前端开发提供高性能和灵活的工具
TanStack 是一个由社区主导的开源项目集合,专注于为现代前端开发提供高性能和灵活的工具。它包括多个流行的 JavaScript 和 TypeScript 库,主要用于处理表格、查询、虚拟化、状态管理等功能。 文章目录 1、TanStack Query:1.1 useQuery&#…...
Java爬虫️ 使用Jsoup库进行API请求有什么优势?
在Java的世界里,Jsoup库以其强大的HTML解析能力而闻名。它不仅仅是一个简单的解析器,更是一个功能齐全的工具箱,为开发者提供了从网页抓取到数据处理的一站式解决方案。本文将深入探讨使用Jsoup库进行API请求的优势,并提供代码示例…...
React源码02 - 基础知识 React API 一览
1. JSX到JavaScript的转换 <div id"div" key"key"><span>1</span><span>2</span> </div>React.createElement("div", // 大写开头会当做原生dom标签的字符串,而组件使用大写开头时,这…...
COMSOL with Matlab
文章目录 基本介绍COMSOL with MatlabCOMSOL主Matlab辅Matlab为主Comsol为辅 操作步骤常用指令mphopenmphgeommghmeshmphmeshstatsmphnavigatormphplot常用指令mphsavemphlaunchModelUtil.clear 实例教学自动另存新档**把语法套用到边界条件**把语法套用到另存新档 函数及其微分…...
【报表查询】.NET开源ORM框架 SqlSugar 系列
文章目录 前言实践一、按月统计没有为0实践二、 统计某月每天的数量实践三、对象和表随意JOIN实践四、 List<int>和表随意JOIN实践五、大数据处理实践六、每10分钟统计Count实践七、 每个ID都要对应时间总结 前言 在我们实际开发场景中,报表是最常见的功能&a…...
PostgreSQL数据库访问限制详解
pg_hba.conf 文件是 PostgreSQL 数据库系统中非常重要的一个配置文件,它用于定义哪些用户(或客户端)可以连接到 PostgreSQL 数据库服务器,以及他们可以使用哪些认证方法进行连接。 pg_hba.conf 的名称来源于 "Host-Based Aut…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
工厂方法模式和抽象工厂方法模式的battle
1.案例直接上手 在这个案例里面,我们会实现这个普通的工厂方法,并且对比这个普通工厂方法和我们直接创建对象的差别在哪里,为什么需要一个工厂: 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类: 两个发…...
