国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

flutter聊天界面-加號【?】更多展開相機、相冊等操作Panel

這篇具有很好參考價值的文章主要介紹了flutter聊天界面-加號【?】更多展開相機、相冊等操作Panel。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

flutter聊天界面-加號【?】更多展開相機、相冊等操作Panel
在之前實現(xiàn)了flutter聊天界面的自定義表情的展示,這里記錄一下更多操作展開的相機、相冊等操作功能實現(xiàn)。

一、查看效果

更多操作展開的相機、相冊等操作功能實現(xiàn)。

flutter聊天界面-加號【?】更多展開相機、相冊等操作Panel,flutter開發(fā)實戰(zhàn),flutter,flutter,flutter聊天界面,操作面板

二、代碼實現(xiàn)

展開的操作按鈕可能比較多,一頁顯示8個、多個可以左右滑動,這里就用到的flutter_swiper插件
這里使用的swpier插件是

  # 輪播圖
  flutter_swiper_null_safety: ^1.0.2

Swiper左右滑動的元素為GridView。
GridView網(wǎng)格布局是一種常見的布局類型,GridView 組件正是實現(xiàn)了網(wǎng)格布局的組件,
SliverGridDelegate是一個抽象類,定義了GridView Layout相關接口,子類需要通過實現(xiàn)它們來實現(xiàn)具體的布局算法。Flutter中提供了兩個SliverGridDelegate的子類SliverGridDelegateWithFixedCrossAxisCount和SliverGridDelegateWithMaxCrossAxisExtent,
每個GridView包括多個相機、相冊等操作按鈕

按鈕如下

// 每個option的大小
class ChatMoreOptionButton extends StatelessWidget {
  const ChatMoreOptionButton({
    Key? key,
    required this.commMoreOption,
    required this.onMoreOptionPressed,
  }) : super(key: key);

  final CommMoreOption commMoreOption;
  final Function(CommMoreOption commMoreOption) onMoreOptionPressed;

  
  Widget build(BuildContext context) {
    EdgeInsets viewPadding = MediaQuery.of(context).viewPadding;
    Size screenSize = MediaQuery.of(context).size;

    double aWidth = (screenSize.width - (kOptionSperate * 5)) / 4;
    double aHeight = (kMorePanelHeight -
            (kOptionSperate * 3) -
            viewPadding.bottom -
            kSwiperPaginationHeight) /
        2;

    double aMin = min(aWidth, aHeight);

    double marginSpace = kOptionSperate / 2;
    return ButtonWidget(
      margin: EdgeInsets.symmetric(
        vertical: marginSpace,
        horizontal: marginSpace,
      ),
      width: aMin,
      height: aMin,
      borderRadius: 6.0,
      bgColor: ColorUtil.hexColor(0xffffff),
      bgHighlightedColor: ColorUtil.hexColor(0xf0f0f0),
      onPressed: () {
        onMoreOptionPressed(commMoreOption);
      },
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          buildButtonIcon(context),
          SizedBox(
            height: 5.0,
          ),
          Text(
            "${commMoreOption.name}",
            textAlign: TextAlign.left,
            maxLines: 1,
            overflow: TextOverflow.ellipsis,
            style: TextStyle(
              fontSize: 12,
              fontWeight: FontWeight.w500,
              fontStyle: FontStyle.normal,
              color: ColorUtil.hexColor(0x333333),
              decoration: TextDecoration.none,
            ),
          ),
        ],
      ),
    );
  }

  Widget buildButtonIcon(BuildContext context) {
    if (CommMoreOptionIconType.commMoreOptionIconFile ==
        commMoreOption.iconType) {
      // 本地圖片
      String imageUrl = "${commMoreOption.icon ?? ""}";
      String start = "file://";
      if (imageUrl.startsWith(start)) {
        String imageAssetFile = imageUrl.substring(start.length);

        return ImageHelper.wrapAssetAtImages(
          "icons/${imageAssetFile}",
          fit: BoxFit.cover,
          width: 26.0,
          height: 26.0,
        );
      }
    } else if (CommMoreOptionIconType.commMoreOptionIconUrl ==
        commMoreOption.iconType) {
      // 網(wǎng)絡圖片
      String imageUrl = "${commMoreOption.icon ?? ""}";
      return ImageHelper.imageNetwork(
        imageUrl: imageUrl,
        fit: BoxFit.cover,
        width: 40.0,
        height: 40.0,
      );
    }

    return Container();
  }
}

GridView實現(xiàn)排列展示

// 一個swiper的容器
class ChatMoreOptionSwiperContainer extends StatefulWidget {
  const ChatMoreOptionSwiperContainer({
    Key? key,
    required this.moreOptions,
    required this.onMoreOptionPressed,
  }) : super(key: key);

  final List<CommMoreOption> moreOptions;
  final Function(CommMoreOption commMoreOption) onMoreOptionPressed;

  
  State<ChatMoreOptionSwiperContainer> createState() =>
      _ChatMoreOptionSwiperContainerState();
}

class _ChatMoreOptionSwiperContainerState
    extends State<ChatMoreOptionSwiperContainer> {
  
  Widget build(BuildContext context) {
    return Container(
      padding: const EdgeInsets.symmetric(horizontal: 10.0),
      child: GridView.builder(
        gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: kGridCrossAxisCount, //每行三列
          childAspectRatio: 1.0, //顯示區(qū)域寬高相等
        ),
        itemCount: widget.moreOptions.length,
        itemBuilder: (context, index) {
          CommMoreOption commMoreOption = widget.moreOptions[index];
          return ChatMoreOptionButton(
            onMoreOptionPressed: widget.onMoreOptionPressed,
            commMoreOption: commMoreOption,
          );
        },
      ),
    );
  }
}

最后使用Swiper實現(xiàn)左右滑動的效果,代碼如下

// 中間間隔
const double kOptionSperate = 15.0;
const double kSwiperPaginationHeight = 10.0;

const int kGridCrossAxisCount = 4;
const int kGridCrossAxisRow = 2;

// 更多操作
class ChatMoreOptionPanel extends StatefulWidget {
  const ChatMoreOptionPanel({
    Key? key,
    required this.morePanelHeight,
    required this.chatInputBarController,
    required this.moreOptionEntries,
  }) : super(key: key);

  final double morePanelHeight;
  final ChatInputBarController chatInputBarController;
  final List<CommMoreOption> moreOptionEntries;

  
  State<ChatMoreOptionPanel> createState() => _ChatMoreOptionPanelState();
}

class _ChatMoreOptionPanelState extends State<ChatMoreOptionPanel> {
  List<CommMoreOption> allOptionList = [];

  List<List<CommMoreOption>> optionSwiperList = [];

  
  void initState() {
    // TODO: implement initState
    super.initState();

    CommMoreOption commMoreOption = CommMoreOption();
    commMoreOption.icon = "file://ic_toolbar_camera.png";
    commMoreOption.name = "相機";
    commMoreOption.iconType = CommMoreOptionIconType.commMoreOptionIconFile;
    commMoreOption.type = 0;
    commMoreOption.linkUrl = kOptionCamera;
    allOptionList.add(commMoreOption);

    CommMoreOption commMoreOption1 = CommMoreOption();
    commMoreOption1.icon = "file://ic_toolbar_ablum.png";
    commMoreOption1.name = "相冊";
    commMoreOption1.iconType = CommMoreOptionIconType.commMoreOptionIconFile;
    commMoreOption1.type = 0;
    commMoreOption1.linkUrl = kOptionAlbum;
    allOptionList.add(commMoreOption1);

    CommMoreOption commMoreOption2 = CommMoreOption();
    commMoreOption2.icon = "file://ic_toolbar_coupon.png";
    commMoreOption2.name = "卡券";
    commMoreOption2.iconType = CommMoreOptionIconType.commMoreOptionIconFile;
    commMoreOption2.type = 0;
    commMoreOption2.linkUrl = kOptionCoupon;
    allOptionList.add(commMoreOption2);

    if (widget.moreOptionEntries.isNotEmpty) {
      allOptionList.addAll(widget.moreOptionEntries);
    }

    handlerSwiperList();
  }

  void handlerSwiperList() {
    List<List<CommMoreOption>> tmpOptionSwiperList = [];
    int aPageNum = kGridCrossAxisCount * kGridCrossAxisRow;
    int swiperCount = (allOptionList.length % aPageNum == 0
            ? allOptionList.length / aPageNum
            : (allOptionList.length / aPageNum + 1))
        .toInt();
    for (int i = 0; i < swiperCount; i++) {
      int location = 0;
      int length = 0;

      location = i * aPageNum;
      if (i == 0) {
        length =
            aPageNum > allOptionList.length ? allOptionList.length : aPageNum;
      } else {
        length = (1 + i) * aPageNum > allOptionList.length
            ? (allOptionList.length - i * aPageNum)
            : aPageNum;
      }

      List<CommMoreOption> swiperItems =
          allOptionList.sublist(location, (location + length));
      tmpOptionSwiperList.add(swiperItems);
    }
    optionSwiperList = tmpOptionSwiperList;
    setState(() {});
  }

  
  void dispose() {
    // TODO: implement dispose
    super.dispose();
  }

  // 點擊不同的操作Option
  void onMoreOptionPressed(CommMoreOption commMoreOption) {
    // 點擊不同的操作Option
    // 發(fā)送eventBus事件
    CommEventBusModel eventBusModel = CommEventBusModel(
      commEventBusType: CommEventBusType.commEventBusTypeMoreOption,
      data: commMoreOption,
    );
    kCommEventBus.fire(eventBusModel);
  }

  
  Widget build(BuildContext context) {
    Size screenSize = MediaQuery.of(context).size;
    return Container(
      width: screenSize.width,
      height: widget.morePanelHeight,
      decoration: BoxDecoration(
        color: ColorUtil.hexColor(0xf7f7f7),
      ),
      padding: EdgeInsets.only(
        left: 0.0,
        right: 0.0,
        bottom: 0.0,
        top: 0.0,
      ),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.start,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          Expanded(
            child: Swiper(
              // 橫向
              scrollDirection: Axis.horizontal,
              // 布局構建
              itemBuilder: (BuildContext context, int index) {
                List<CommMoreOption> optionList = optionSwiperList[index];
                return ChatMoreOptionSwiperContainer(
                  moreOptions: optionList,
                  onMoreOptionPressed: (CommMoreOption commMoreOption) {
                    onMoreOptionPressed(commMoreOption);
                  },
                );
              },
              //條目個數(shù)
              itemCount: optionSwiperList.length,
              // 自動翻頁
              autoplay: false,
              // 分頁指示
              pagination: SwiperPagination(
                //指示器顯示的位置 Alignment.bottomCenter 底部中間
                alignment: Alignment.bottomCenter,
                // 距離調整
                margin: const EdgeInsets.only(bottom: 0.0),
                // 指示器構建
                builder: DotSwiperPaginationBuilder(
                  // 點之間的間隔
                  space: 3,
                  // 沒選中時的大小
                  size: 6,
                  // 選中時的大小
                  activeSize: 6,
                  // 沒選中時的顏色
                  color: ColorUtil.hexColor(0xDCDCDC),
                  //選中時的顏色
                  activeColor: ColorUtil.hexColor(0xff462e),
                ),
              ),
              // pagination: _buildSwiperPagination(),
              // pagination: _buildNumSwiperPagination(),
              //點擊事件
              onTap: (index) {
                print(" 點擊 " + index.toString());
              },
              // 相鄰子條目視窗比例
              viewportFraction: 1,
              // 用戶進行操作時停止自動翻頁
              autoplayDisableOnInteraction: true,
              // 無限輪播
              loop: false,
              //當前條目的縮放比例
              scale: 1,
            ),
          ),
          buildAreaBottom(context),
        ],
      ),
    );
  }

  Widget buildAreaBottom(BuildContext context) {
    EdgeInsets viewPadding = MediaQuery.of(context).viewPadding;
    Size screenSize = MediaQuery.of(context).size;
    return Container(
      decoration: BoxDecoration(
        color: ColorUtil.hexColor(0xf7f7f7),
      ),
      height: viewPadding.bottom,
      width: screenSize.width,
    );
  }
}

三、小結

flutter聊天界面-加號【?】更多展開相機、相冊等操作Panel菜單,主要Swiper和GridView排列相機、相冊等按鈕,點擊按鈕時候發(fā)送事件,使用EventBus來處理后續(xù)的邏輯實現(xiàn)。

學習記錄,每天不停進步。文章來源地址http://www.zghlxwxcb.cn/news/detail-537631.html

到了這里,關于flutter聊天界面-加號【?】更多展開相機、相冊等操作Panel的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • flutter聊天界面-Text富文本表情emoji、url、號碼展示

    flutter聊天界面-Text富文本表情emoji、url、號碼展示

    flutter聊天界面-Text富文本表情emoji、url、號碼展示 Text富文本表情emoji展示,主要通過實現(xiàn)Text.rich展示文本、emoji、自定義表情、URL等 Text用于顯示簡單樣式文本 TextSpan它代表文本的一個“片段”,不同“片段”可按照不同的樣式顯示。 示例片段 Text富文本表情emoji展示主要通過

    2024年02月12日
    瀏覽(18)
  • flutter聊天界面-TextField輸入框buildTextSpan實現(xiàn)@功能展示高亮功能

    flutter聊天界面-TextField輸入框buildTextSpan實現(xiàn)@功能展示高亮功能

    flutter聊天界面-TextField輸入框buildTextSpan實現(xiàn)@功能展示高亮功能 最近有位朋友討論的時候,提到了輸入框的高亮展示。在flutter TextField中需要插入特殊樣式的標簽,比如:“請 @張三 回答一下”,這一串字符在TextField中輸入,當輸入@時 彈出好友列表選擇,然后將 “@張三”高

    2024年02月07日
    瀏覽(38)
  • 微軟將推出更多Edge特有功能,與Chrome展開競爭

    微軟將推出更多Edge特有功能,與Chrome展開競爭

    微軟在 2018 年宣布將推出基于 Chromium 構建的 Edge 瀏覽器,并于 2020 年 1 月推出了新版 Edge。如今時隔三年,根據(jù)統(tǒng)計 Edge 全平臺的市場占有率僅為 4.23%,如果只考慮桌面端的話,Edge 的市場占有率則是 10.98%,這兩個數(shù)據(jù)均遠遠落后于 Chrome 的 64.68% 和 66.14%。 再加上 Edge 如今已

    2024年02月17日
    瀏覽(24)
  • CSS處理文字段落尾行行末縮進,點擊查看更多展開效果

    CSS處理文字段落尾行行末縮進,點擊查看更多展開效果

    需求: ?如圖:第三行文末需要展示省略號,并且有查看更多按鈕,切換顯示隱藏。 常規(guī)css處理方法: 控制文字行數(shù): // 多行顯示 .text_morerow { ? ? overflow: hidden; ? ? display: -webkit-box; ? ? -webkit-line-clamp: 2; // 控制顯示行數(shù) ? ? -webkit-box-orient: vertical; ? ? word-break: break-all;?

    2024年02月06日
    瀏覽(78)
  • vue 實現(xiàn)內容超出兩行顯示展開更多功能,可依據(jù)需求自定義任意行數(shù)!

    vue 實現(xiàn)內容超出兩行顯示展開更多功能,可依據(jù)需求自定義任意行數(shù)!

    平時開發(fā)中我們經(jīng)常會遇到這樣的需求,在一個不限高度的盒子中會有很多內容,如果全部顯示用戶體驗會非常不好,所以可以先折疊起來,當內容達到一定高度時,顯示 展開更多 按鈕, 點擊即可顯示全部內容 ,先來看看效果圖: ?這樣做用戶體驗瞬間得到提升,接下來看

    2023年04月24日
    瀏覽(25)
  • uniapp 水印/相機/授權位置、相機、相冊權限

    自定義相機水印 授權 ?? ?// 手動授權【攝像頭】 ?? ?function getAuth() { ?? ??? ?// 獲取攝像頭權限 ?? ??? ?uni.getSetting({ ?? ??? ??? ?success(res) { ?? ??? ??? ??? ?console.log(\\\"auth res\\\", res); ?? ??? ??? ??? ?const authSetting = res.authSetting; ?? ??? ??? ??? ?if (auth

    2024年02月02日
    瀏覽(24)
  • iOS——調用系統(tǒng)相冊和相機

    iOS——調用系統(tǒng)相冊和相機

    調用相冊需要用到UIImagePickerController,這是iOS系統(tǒng)提供的和系統(tǒng)的相冊和相機交互的一個類,可以用來獲取相冊的照片,也可以調用系統(tǒng)的相機拍攝照片或者視頻。該類的繼承結構是: UIImagePickerController–UINavigationController–UIViewController–UIResponder–NSObject 首先需要導入對應的庫和

    2024年02月04日
    瀏覽(18)
  • flutter開發(fā)實戰(zhàn)-圖片保存到相冊

    flutter開發(fā)實戰(zhàn)-圖片保存到相冊。保存相冊使用的是image_gallery_saver插件 在pubspec.yaml中引入插件 使用image_gallery_saver將圖片保存到相冊 flutter開發(fā)實戰(zhàn)-圖片保存到相冊。保存相冊使用的是image_gallery_saver插件。 學習記錄,每天不停進步。

    2024年02月15日
    瀏覽(15)
  • flutter base64圖片保存到相冊

    首先base64轉成uint8List,然后再用插件保存到相冊(沒有內置的方法處理) 保存圖片的插件 完整代碼如下 為啥要用下面 因為’data:image/png;base64,’ is part of the data URL,不是base-64字符串的一部分。您需要首先從URL中提取base-64數(shù)據(jù)。 否則就會報錯如下: 網(wǎng)站用圖片轉base64如下

    2024年02月01日
    瀏覽(17)
  • 安卓WebView(H5)調用原生相機及相冊

    安卓WebView(H5)調用原生相機及相冊

    在開始敘述正文之前筆者先聲明一下應用場景:例如在網(wǎng)頁上的即時通訊需要能拍照或者從圖庫選擇圖片來進行上傳,此場景下就可以用到這篇文章的內容 正文 首先,如果你已經(jīng)把相機以及訪問文件夾的權限都加上了并且WebView的基礎操作都做完了,就差上傳圖片了的話那就參

    2024年02月11日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包