美文网首页
Flutter 重复造轮子 (3) Grid Avatar Gr

Flutter 重复造轮子 (3) Grid Avatar Gr

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

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

介绍

头像组组件 九宫格显示头像组 最多显示9张


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

代码演示

基础用法

            HcAvatarGridGroup(
              avatarList: [
                HcAvatarItem(backgroundImageUrl: 'assets/images/group.png'),
                HcAvatarItem(name: "张二"),
                HcAvatarItem(name: "张三"),
                HcAvatarItem(name: "张四"),
                HcAvatarItem(name: "张五"),
                HcAvatarItem(name: "张六"),
                HcAvatarItem(name: "张七"),
                HcAvatarItem(name: "张八"),
                HcAvatarItem(name: "张九"),
              ],
            ),

群头像

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

            HcAvatarGridGroup(
              avatarList: [
                HcAvatarItem(backgroundImageUrl: 'assets/images/group.png'),
                HcAvatarItem(name: "张二"),
                HcAvatarItem(name: "张三"),
                HcAvatarItem(name: "张四"),
                HcAvatarItem(name: "张五"),
                HcAvatarItem(name: "张六"),
                HcAvatarItem(name: "张七"),
                HcAvatarItem(name: "张八"),
                HcAvatarItem(name: "张九"),
              ],
               coverImage: 'assets/images/group.png',
            ),

设置大小

可以设置图片组的总大小 内部子组件自动计算

         HcAvatarGridGroup(
              size: 64,
              avatarList: [
                HcAvatarItem(backgroundImageUrl: 'assets/images/group.png'),
                HcAvatarItem(name: "张二"),
                HcAvatarItem(name: "张三"),
                HcAvatarItem(name: "张五"),
              ],
            ),

设置是否翻转

reverse默认为true 表示底部永远铺满缺口再上,如果希望缺口在下请设置false

            HcAvatarGridGroup(
              size: 64,
              reverse: true,
              avatarList: [
                HcAvatarItem(backgroundImageUrl: 'assets/images/group.png'),
                HcAvatarItem(name: "张二"),
                HcAvatarItem(name: "张三"),
                HcAvatarItem(name: "张四"),
                HcAvatarItem(name: "张五"),
                HcAvatarItem(name: "张六"),
                HcAvatarItem(name: "张七"),
                HcAvatarItem(name: "张八"),
                HcAvatarItem(name: "张九"),
              ],
              // coverImage: 'assets/images/group.png',
            ),

设置内部子组件间距

            HcAvatarGridGroup(
              size: 64,
              reverse: true,
              padding: 1,
              avatarList: [
                HcAvatarItem(backgroundImageUrl: 'assets/images/group.png'),
                HcAvatarItem(name: "张二"),
                HcAvatarItem(name: "张三"),
                HcAvatarItem(name: "张四"),
                HcAvatarItem(name: "张五"),
                HcAvatarItem(name: "张六"),
                HcAvatarItem(name: "张七"),
                HcAvatarItem(name: "张八"),
                HcAvatarItem(name: "张九"),
              ],
            ),

API

props

参数 说明 类型 默认值 是否必填
avatarList 头像列表 List<HcAvatarItem> - true
size 组件大小 double 96.0 false
radius 头像圆角 double 10.0 false
padding 子组件内部间距 double 1.0 false
reverse 是否颠倒 bool true false
coverImage 头像组的覆盖头像 String - false
backgroundColor 背景颜色 Color - false

HcAvatarItem

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

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

项目代码

///头像组
class HcAvatarItem {
  final String? backgroundImageUrl;
  final String? foregroundImageUrl;
  final String? name;
  final Color? backgroundColor;
  final IconData? icon;

  HcAvatarItem(
      {this.backgroundColor,
      this.foregroundImageUrl,
      this.name,
      this.icon,
      this.backgroundImageUrl});
}

class HcAvatarGridGroup extends StatelessWidget {
  //图片组
  final List<HcAvatarItem> avatarList;

  //覆盖图片
  final String? coverImage;

  //图片组大小
  final double size;
  final double padding;
  final bool reverse;
  final Color backgroundColor;
  final double? radius;

  const HcAvatarGridGroup(
      {super.key,
      required this.avatarList,
      this.coverImage,
      this.size = HcSize.defaultAvatarGroupSize,
      this.reverse = true,
      this.padding = 1,
      this.backgroundColor = Colors.grey,
      this.radius});

  @override
  Widget build(BuildContext context) {
    //如果是图片组当图片解决
    if (coverImage != null) {
      return HcAvatar(
        size: size,
        radius: HcSize.defaultAvatarGroupRadius,
        backgroundImageUrl: coverImage,
      );
    }
    if (avatarList.length == 1) {
      HcAvatarItem item = avatarList[0];
      return HcAvatar(
        borderWidth: 0,
        size: size,
        radius: HcSize.defaultAvatarGroupRadius,
        backgroundImageUrl: item.backgroundImageUrl,
        foregroundImageUrl: item.foregroundImageUrl,
        child: item.icon != null
            ? Icon(
                item.icon,
                size: size / 8,
              )
            : Text(
                item.name ?? '',
                style: TextStyle(fontSize: size / 8),
              ),
      );
    }
    //分割列表最大显示九个
    List<HcAvatarItem> finalList =
        avatarList.length > 9 ? avatarList.sublist(0, 9) : avatarList;
    //文字方向
    TextDirection textDirection = TextDirection.ltr;
    //显示方向
    VerticalDirection verticalDirection = VerticalDirection.down;
    if (reverse) {
      finalList = finalList.reversed.toList();
      textDirection = TextDirection.rtl;
      verticalDirection = VerticalDirection.up;
    }
    return Container(
      height: size,
      width: size,
      decoration: BoxDecoration(
          color: backgroundColor,
          borderRadius:
              BorderRadius.circular(radius ?? HcSize.defaultAvatarGroupRadius)),
      padding: EdgeInsets.all(padding),
      child: Center(
        child: Wrap(
          spacing: padding,
          runSpacing: padding,
          direction: Axis.horizontal,
          textDirection: textDirection,
          verticalDirection: verticalDirection,
          alignment: WrapAlignment.center,
          runAlignment: WrapAlignment.spaceBetween,
          crossAxisAlignment: WrapCrossAlignment.center,
          children: finalList
              .map((item) => HcAvatar(
                    borderWidth: 0,
                    size: finalList.length < 5
                        ? ((size - 3 * padding) / 2)
                        : ((size - 4 * padding) / 3),
                    radius: HcSize.defaultAvatarGroupRadius,
                    backgroundImageUrl: item.backgroundImageUrl,
                    foregroundImageUrl: item.foregroundImageUrl,
                    child: item.icon != null
                        ? Icon(
                            item.icon,
                            size: size / 8,
                          )
                        : Text(
                            item.name ?? '',
                            style: TextStyle(fontSize: size / 8),
                          ),
                  ))
              .toList(),
        ),
      ),
    );
  }
}

相关文章

网友评论

      本文标题:Flutter 重复造轮子 (3) Grid Avatar Gr

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