美文网首页
Flutter 重复造轮子 (4) Stack Avatar G

Flutter 重复造轮子 (4) Stack Avatar G

作者: 半城半离人 | 来源:发表于2023-09-09 08:52 被阅读0次

详细可以访问仓库 HcUi: 重复创造Flutter 的轮子 在原有组件上拓展 展现出新的特性 (gitee.com)
需要配合HcAvatar组件Flutter 重复造轮子 (2) Avatar 头像显示组件的封装使用

介绍

头像组组件 多层头像横向堆叠


Screenshot_2023-09-07-16-39-51-0900154547.png

代码演示

基础用法

            HcAvatarStackGroup(
              avatarList: [
                HcAvatarItem(backgroundImageUrl: 'assets/images/group.png'),
                HcAvatarItem(name: "张零"),
              ],
            ),

展示更多按钮

如果有设置群头像可以使用coverImage字段覆盖头像

            HcAvatarStackGroup(
              avatarList: [
                HcAvatarItem(backgroundImageUrl: 'assets/images/group.png'),
                HcAvatarItem(name: "张零"),
              ],
              showMoreIcon: true,
            ),

设置大小

可以设置头像单个的大小

            HcAvatarStackGroup(
              size: 36,
              avatarList: [
                HcAvatarItem(backgroundImageUrl: 'assets/images/group.png'),
                HcAvatarItem(name: "张零"),
              ],
              showMoreIcon: true,
            ),

设置是否翻转

reverse默认为false false前一个压后一个 后一个是完整显示的 true是与之相反

            HcAvatarStackGroup(
              reverse: false,      
              size: 36,
              avatarList: [
                HcAvatarItem(backgroundImageUrl: 'assets/images/group.png'),
                HcAvatarItem(name: "张零"),
              ],
              showMoreIcon: true,
            ),

设置内部子组件间距

        HcAvatarStackGroup(
              reverse: false,
              borderWidth: 3,
              size: 36,
              spaceWidth: 0.7,
              borderColor: Colors.yellow,
              avatarList: [
                HcAvatarItem(backgroundImageUrl: 'assets/images/group.png'),
                HcAvatarItem(name: "张零"),
              ],
              showMoreIcon: true,
            ),

API

props

参数 说明 类型 默认值 是否必填
avatarList 头像列表 List<HcAvatarItem> - true
size 单个头像的大小 double 40.0 false
radius 单个头像圆角 double 99999 false
spaceWidth 两个组件间隔 double 0.7 false
reverse 是否颠倒 bool false false
borderColor 边框的颜色 Color Colors.grey false
borderWidth 边框的宽度 double 1.0 false
showMoreIcon 是否展示更多的按钮 bool false false

spaceWidth

spaceWidth 在0-1之间表示组件相折叠 超过1表示组件间分离 (数字为size的倍数)

HcAvatarItem

快速构建HcAvatar的必要参数 详情可以参考HcAvatar

参数 说明 类型 默认值 是否必填
backgroundImageUrl 背景图片地址 String - false
foregroundImageUrl 前景图片地址 String - false
name 用户名称 String - false
backgroundColor 背景颜色 Color - false
icon 图标 IconData - false

项目源码

class HcAvatarStackGroup extends StatelessWidget {
  //图片的列表
  final List<HcAvatarItem> avatarList;

  //是否展示更多的 Icon
  final bool showMoreIcon;

  //边框颜色
  final Color borderColor;

  //边框宽度
  final double borderWidth;

  //是否反方向
  final bool reverse;

  //缩进大小
  final double spaceWidth;

  //子组件大小
  final double size;

  //子组件的圆角矩形
  final double radius;

  const HcAvatarStackGroup(
      {super.key,
      required this.avatarList,
      this.showMoreIcon = false,
      this.borderColor = HcColor.defaultBorderColor,
      this.borderWidth = HcSize.defaultAvatarBorderWidth,
      this.reverse = false,
      this.spaceWidth = HcSize.defaultAvatarSpaceWidth,
      this.size = HcSize.defaultAvatarSize,
      this.radius = HcSize.defaultMaxRadius});

  @override
  Widget build(BuildContext context) {
    return LayoutBuilder(builder: (context, constraints) {
      //获取最大宽度
      double maxWidth = constraints.maxWidth;
      //每个子组件大小
      double widgetWidth = size + borderWidth * 2;
      //最大可展示数字
      int num = (maxWidth - widgetWidth) ~/ (spaceWidth * widgetWidth);
      //构建列表
      List finalList = avatarList;
      if (finalList.length >= num) {
        finalList = avatarList.sublist(0, showMoreIcon ? num : min(finalList.length,num + 1));
      }
      if (showMoreIcon) {
        finalList.add(HcAvatarItem(icon: Icons.more_horiz_outlined));
      }
      if (reverse) {
        finalList = finalList.reversed.toList();
      }
      return SizedBox(
        height: widgetWidth,
        child: Stack(
          children: finalList
              .map((item) => Positioned(
                  left: widgetWidth *
                      spaceWidth *
                      (reverse
                          ? (finalList.length - finalList.indexOf(item) - 1)
                          : finalList.indexOf(item)),
                  child: HcAvatar(
                    size: size,
                    radius: radius,
                    backgroundImageUrl: item.backgroundImageUrl,
                    foregroundImageUrl: item.foregroundImageUrl,
                    backgroundColor:
                        item?.backgroundColor ?? Theme.of(context).primaryColor,
                    borderWidth: borderWidth,
                    borderColor: borderColor,
                    child: item.icon != null
                        ? Icon(item.icon)
                        : Text(item.name ?? ''),
                  )))
              .toList(),
        ),
      );
    });
  }
}

相关文章

  • 开源时代,一杯敬明天,一杯敬过往

    Reinvent the Wheel 从“我们不要重复造轮子”到,兄弟们“我们造轮子”吧 不要重复造轮子 意味着我...

  • 程序员应该知道的事儿

    避免重复造轮子

  • IT重复造轮子

    今天同事说有个odoo的开源系统,看是否可以集成到我们项目中。百度了一下,发现居然是个强大的系统,集成了企业ERP...

  • 不要重复造轮子

    前端常用网站、工具

  • 不重复造轮子

    阳老师在开智书友会上讲,许多人问他的问题都是心理咨询类,这个不是他的特长,他不回答。他也说过,他的特长是认知科学,...

  • 不要重复造轮子

    你想做的任何事,这个世界上都一定有人想到、做到、经历过了,不要重复造轮子,要有意识去收集信息。不然可能努力好多年,...

  • 教你手写全局异常拦截器

    为什么要重复造轮子 你可能会问,Spring已经自带了全局异常拦截,为什么还要重复造轮子呢? 这是个好问题,我觉得...

  • Android OkHttp 史上最优雅的设置baseUrl

    为何要重复造轮子 为什么要重复造轮子?无非就一个原因 以前的轮子有些功能不好用,用起来不够优雅 我们先来说说第一条...

  • C++学习笔记(一)- 基础

    开源的经典之言就是:不要重复造轮子。然而,会造轮子才能更好的是用别人的轮子,因为C++只是略懂,我也比较喜欢底层。...

  • 封装

    造轮子有时既繁琐又无聊,所以有人制造出生产轮子的工厂,批量产轮子,省却了他人重复造轮子的痛苦。这是社会分工法则的一...

网友评论

      本文标题:Flutter 重复造轮子 (4) Stack Avatar G

      本文链接:https://www.haomeiwen.com/subject/ksybsdtx.html