当前位置: 首页 > news >正文

Flutter笔记--SliverFloatingHeader

Flutter开发中,SliverFloatingHeader是专门用于简化浮动头部的实现,它的作用是响应用户的滚动方向来控制头部组件的显示与隐藏,简单总结如下:

API:
FloatingHeaderSnapMode.overlay:当向下滑动触发头部展开时,头部会像浮层一样直接覆盖在列表内容的上方。
FloatingHeaderSnapMode.scroll:适合不需要改变列表滚动位置的悬浮组件。例如,应用首页的搜索栏或悬浮操作按钮。
场景:
1 应用首页搜索栏
2 新闻应用标题栏
栗子:

class Demo extends StatelessWidget { const Demo ({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: const Text("浮动卡片区域")), body: CustomScrollView( slivers: [ SliverFloatingHeader( animationStyle: AnimationStyle( duration: const Duration(milliseconds: 220), curve: Curves.easeOut, ), snapMode: FloatingHeaderSnapMode.overlay, child: Container( margin: const EdgeInsets.all(12), padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.blueAccent.shade100, borderRadius: BorderRadius.circular(10), ), child: const Text( "浮动展示卡片:拖动滚动会触发吸附动画", style: TextStyle(fontSize: 16), ), ), ), SliverList( delegate: SliverChildBuilderDelegate( (context, index) => ListTile( leading: const Icon(Icons.inventory_2), title: Text("商品条目 ${index + 1}"), subtitle: Text("条目详情描述 ${index + 1}"), ), childCount: 35, ), ), ], ), ), ); } }
class StickyHeaderDelegate extends SliverPersistentHeaderDelegate { final Widget content; final double height; StickyHeaderDelegate({required this.content, required this.height}); @override Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) => content; @override double get maxExtent => height; @override double get minExtent => height; @override bool shouldRebuild(covariant StickyHeaderDelegate oldDelegate) => oldDelegate.content != content; } class TestDemo extends StatelessWidget { const TestDemo ({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: const Text("多模块滚动布局")), body: CustomScrollView( slivers: [ SliverToBoxAdapter( child: Container( height: 130, width: double.infinity, color: Colors.orangeAccent, alignment: Alignment.center, child: const Text("首页活动横幅", style: TextStyle(fontSize: 22, color: Colors.white)), ), ), // 浮动公告卡片 SliverFloatingHeader( animationStyle: AnimationStyle( duration: const Duration(milliseconds: 280), curve: Curves.easeInOutCubic, ), snapMode: FloatingHeaderSnapMode.scroll, child: Container( margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), padding: const EdgeInsets.all(14), decoration: BoxDecoration( color: Colors.indigo.shade50, borderRadius: BorderRadius.circular(8), ), child: const Text("限时公告:全场数码商品满减活动开启"), ), ), // 第一层常驻吸顶栏 SliverPersistentHeader( pinned: true, delegate: StickyHeaderDelegate( height: 46, content: Container( color: Colors.teal, alignment: Alignment.centerLeft, padding: const EdgeInsets.only(left: 16), child: const Text("一级分类:数码专区", style: TextStyle(color: Colors.white)), ), ), ), SliverPersistentHeader( pinned: true, delegate: StickyHeaderDelegate( height: 42, content: Container( color: Colors.green.shade400, alignment: Alignment.centerLeft, padding: const EdgeInsets.only(left: 16), child: const Text("二级分类:手机配件", style: TextStyle(color: Colors.white)), ), ), ), SliverList( delegate: SliverChildBuilderDelegate( (context, index) => ListTile( title: Text("数码单品 ${index + 1}"), trailing: Text("¥${99 + index * 20}"), ), childCount: 50, ), ), ], ), ), ); } }

注意:
1 必须配合CustomScrollView
2 避免嵌套滚动视图 确保所有的Sliver组件都在同一个CustomScrollView中,避免嵌套多个滚动视图导致滚动冲突问题。

http://www.jsqmd.com/news/1408376/

相关文章:

  • 零基础玩转微信抢红包插件WeChatLuckyMoney:从安装到高阶调优的完整实战笔记
  • 职场新人适应指南:从环境到身份的五个系统性切换
  • 右键菜单越用越乱?可视化开关加免碰注册表,ContextMenuManager 一次清干净
  • LAV Filters 安装配置全攻略:一套解码器搞定 Windows 上几乎所有视频格式
  • PyTorch张量操作与自动微分实战指南
  • CommunityToolkit
  • Android WebView兼容性终极方案:腾讯TBS X5内核集成实战与避坑指南
  • nat配置
  • 燃料电池汽车信号交叉口节能优化策略研究
  • AI工程化实践:从工具应用到研发流程重构的早期采用策略
  • DC综合中ICG插入:原理、实现与功耗优化实战
  • 再论勾股定理成立的条件-12
  • 索尼 A7R VI:6680 万像素高分辨率与高速度兼得,性价比远超 A1!
  • 终端与命令行进阶(4):fzf 模糊查找提效
  • 《创业之路》-922-顶层掌控资源、权力、名声,人脉,交换资源。互惠互利;中层承上启下,分解、执行、监督。底层卖能力、永远竞争内卷。为什么吗?金字塔结构!
  • 微信抢红包插件保姆级实战指南:三步配好,群里红包再也不用拼手速
  • 智能体长期记忆管理:Scope-Recall-Hermes架构解析与工程实践
  • Oracle EBS客户端JRE加载失败:从环境变量到注册表的系统性排查与修复
  • 分拆数 - 生成函数
  • LipoAgent:基于多智能体协作的AI药物分子安全设计框架
  • Python文件操作核心:open()函数参数详解与避坑指南
  • SystemVerilog覆盖率:从代码覆盖到功能覆盖的芯片验证实践
  • BepInEx 终极安装指南:3 步让 Unity 游戏跑起第一个插件
  • AI基础设施重构:Rust与Mojo如何提升Python性能瓶颈
  • 数学建模与算法设计:从问题定义到高效求解的完整路径
  • LLM浏览器代理指纹识别:基于UI交互行为序列的AI身份追踪技术
  • 三相功率计算:P=√3UIcosφ与P=3UIcosφ的深度辨析与应用指南
  • LAV Filters 完整上手指南:免费开源的 Windows 万能解码器,一次装好告别视频格式烦恼
  • 【架构实战】Web安全防护实战:从XSS、CSRF到SQL注入的攻防一线
  • Python爬虫实战:构建Wallheaven壁纸自动下载工具