首页 > 其他分享 >一统天下 flutter - widget Sliver: SliverPersistentHeader - 自定义可展开/收缩的标题栏

一统天下 flutter - widget Sliver: SliverPersistentHeader - 自定义可展开/收缩的标题栏

时间:2023-04-23 16:55:36浏览次数:62  
标签:widget 自定义 收缩 标题栏 override SliverPersistentHeader maxExtent

源码 https://github.com/webabcd/flutter_demo
作者 webabcd

一统天下 flutter - widget Sliver: SliverPersistentHeader - 自定义可展开/收缩的标题栏

示例如下:

lib\widget\sliver\sliver_persistent_header.dart

/*
 * SliverPersistentHeader - 自定义可展开/收缩的标题栏
 */

import 'dart:math';

import 'package:flutter/material.dart';

import '../../helper.dart';

class SliverPersistentHeaderDemo extends StatefulWidget {
  const SliverPersistentHeaderDemo({Key? key}) : super(key: key);

  @override
  _SliverPersistentHeaderDemoState createState() => _SliverPersistentHeaderDemoState();
}

class _SliverPersistentHeaderDemoState extends State<SliverPersistentHeaderDemo> {

  final _random = Random();
  Color _getRandomColor() {
    return Color.fromARGB(255, _random.nextInt(256), _random.nextInt(256), _random.nextInt(256),);
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.white,
      child: CustomScrollView(
        slivers: [
          /// 使用自定义可展开/收缩的标题栏
          SliverPersistentHeader(
            delegate: _MySliverPersistentHeaderDelegate(),
            /// true - 下拉滚动时,即使当前 CustomScrollView 不在顶部,SliverPersistentHeader 也会向下展开
            /// false - 下拉滚动时,只有当前 CustomScrollView 在顶部时,SliverPersistentHeader 才会向下展开
            floating: true,
            /// true - SliverPersistentHeader 在完全收缩状态时,其高度为 SliverPersistentHeaderDelegate 的 minExtent
            /// false - SliverPersistentHeader 在完全收缩状态时,会彻底隐藏
            pinned: true,
          ),

          SliverList(
            delegate: SliverChildBuilderDelegate((context, index) =>
                Container(color: _getRandomColor(), height: 150,),
              childCount: 20,
            ),
          ),
        ],
      ),
    );
  }
}

/// 自定义可展开/收缩的标题栏的具体逻辑
class _MySliverPersistentHeaderDelegate extends SliverPersistentHeaderDelegate {

  final double _minExtent = 100;
  final double _maxExtent = 300;

  /// 当展开/收缩的大小发生变化时就会执行到这里
  @override
  Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) {
    /// shrinkOffset - 高度的偏移量(0 - maxExtent 之间)
    ///   完全展开状态,此值为 0
    ///   完全收缩状态,此值为 maxExtent
    log('shrinkOffset:$shrinkOffset, overlapsContent:$overlapsContent');
    return Container(
      alignment: Alignment.center,
      decoration: const BoxDecoration(
        image: DecorationImage(
          image: AssetImage("assets/son.jpg"),
          fit: BoxFit.cover,
        ),
      ),
    );
  }

  /// 完全展开状态的高度
  @override
  double get maxExtent => _maxExtent;

  /// 完全收缩状态的高度
  @override
  double get minExtent => _minExtent;

  /// 是否需要重建(当 maxExtent 或 minExtent 发生变化时,应该返回 true)
  @override
  bool shouldRebuild(covariant _MySliverPersistentHeaderDelegate oldDelegate) {
    return false;
  }
}

源码 https://github.com/webabcd/flutter_demo
作者 webabcd

标签:widget,自定义,收缩,标题栏,override,SliverPersistentHeader,maxExtent
From: https://www.cnblogs.com/webabcd/p/flutter_lib_widget_sliver_sliver_persistent_header.html

相关文章

  • 自定义starter
    将redis生成分布式唯一id的功能封装成starter供其他模块使用1 编写业务类packagecom.yangkun.redis;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.redis.core.StringRedisTemplate;importorg.springframework.tran......
  • 自定义注解获取当前登录信息
    登录注解/***@authorzhourui*@date2023/4/189:39*/importjava.lang.annotation.*;/***@authorzhourui*@date2023/4/1714:42*/@Documented@Target(ElementType.METHOD)@Retention(value=RetentionPolicy.RUNTIME)public@interfaceReLogin{}......
  • Vue 3.0自定义指令
    Vue2和Vue3在自定义指令上有一些差异,并不完全一致,下面的介绍主要是针对Vue3的介绍。1.作用域自定义指令有两种作用域,一种是局部的自定义指令,还有一种是全局的自定义指令。局部的自定义指令就只能在当前.vue文件中使用,全局的则可以在main.js里挂载之后,在所有的.vue文件......
  • shell自定义函数
    函数调用通常将函数看成是脚本中的一段代码,在使用函数前必须先定义该函数,使用时利用函数名直接调用。例:编写脚本func_script,内容如下。#!/bin/bashREPEAT=3fa(){echo"Nowfafunctionisstarting..."echo}fb(){i=0echo"Andnowthefbbebins."sleep......
  • 从数据库查询权限信息、自定义失败处理
    从数据库查询权限信息我们只需要根据用户id去查询到其所对应的权限信息即可。所以我们可以先定义个mapper,其中提供一个方法可以根据userid查询权限信息。MenuMapper持久层接口publicinterfaceMenuMapperextendsBaseMapper<Menu>{List<String>selectPermsByUser......
  • nginx自定义负载均衡及根据cpu运行自定义负载均衡
    1.nginx如何自定义负载均衡在Nginx中,可以通过配置文件自定义负载均衡策略。具体步骤如下:首先,在Nginx配置文件中定义一个upstream模块,并设置负载均衡策略和后端服务器列表,例如:upstreammyapp{serverbackend1.example.comweight=3;serverbackend2.example.com;se......
  • node-red 在功能模块下自定义节点
    在目录下node-red\packages\node_modules\@node-red\nodes\core\function下创建compare.js和compare.html demo.js demo.html确保 data-template-name与RED.nodes.registerType的名称要一致 然后npmrunstart就可以看到 注:https://blog.csdn.net/wmjjjj/artic......
  • qt-自定义界面
     https://blog.csdn.net/XCJandLL/article/details/125631053https://blog.csdn.net/qq_20792765/article/details/109840347https://blog.csdn.net/qq_20792765/article/details/109768594https://blog.csdn.net/qq_42964109/article/details/126884439https://blog.csd......
  • C++调用自定义源文件函数
    C++调用自定义源文件函数的步骤如下:在需要调用函数的源文件中包含自定义源文件的头文件。例如,如果需要调用名为myfunc.cpp的自定义源文件中的函数,则需要在调用该函数的源文件中包含myfunc.h头文件。编译自定义源文件。如果使用命令行编译,可以使用以下命令编译自定义源文件并生成......
  • 2、Pipeline语法及使用自定义工具的Maven工程
    Pipeline语法声明式pipeline的结构pipeline的定义有一个明确的、必须遵循的结构,它由一些directive(指令)和section(配置段)组成,每一个section又可包含其它的section、directive和step(执行步骤),以及一些condition(执行条件)的定义;◼Section:用于将那些在某个时间点需要一同运行的条目(i......