Flutter 重復造輪子 (4) Stack Avatar Group 橫向頭像組組件的封裝

詳細可以訪問倉庫 HcUi: 重復創(chuàng)造Flutter 的輪子 在原有組件上拓展 展現(xiàn)出新的特性 (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,
            ),

設置是否翻轉(zhuǎn)

reverse默認為false false前一個壓后一個 后一個是完整顯示的 true是與之相反

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

設置內(nèi)部子組件間距

        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

參數(shù) 說明 類型 默認值 是否必填
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表示組件間分離 (數(shù)字為size的倍數(shù))

HcAvatarItem

快速構(gòu)建HcAvatar的必要參數(shù) 詳情可以參考HcAvatar

參數(shù) 說明 類型 默認值 是否必填
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;

  //邊框?qū)挾?  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;
      //最大可展示數(shù)字
      int num = (maxWidth - widgetWidth) ~/ (spaceWidth * widgetWidth);
      //構(gòu)建列表
      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(),
        ),
      );
    });
  }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容