Flutter高仿微信-第42篇-创建群

news2025/7/11 3:02:25

Flutter高仿微信系列共59篇,从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。

 详情请查看

效果图:

实现代码:

/**
 * Author : wangning
 * Email : maoning20080809@163.com
 * Date : 2022/11/6 19:46
 * Description : 发起群聊
 */

class AddGroup extends StatefulWidget{

  @override
  State<StatefulWidget> createState() => _AddGroupState();

}

class _AddGroupState extends State<AddGroup>{

  final ScrollController _scrollController = ScrollController(); //listview 的控制器
  List<ContactsBeanComb> _contactList = [];
  bool isLoading = false;
  String account = SpUtils.getString(CommonUtils.LOGIN_ACCOUNT);

  UserBean? _userBean;

  @override
  void initState() {
    super.initState();
    _getData();
  }

  _getData() async {
    List<ContactsBeanComb> contactList = await ContactsRepository.getInstance().findAllContactsComb(account);
    _userBean = await UserRepository.getInstance().findUserByAccount(account);
    setState(() {
      _contactList = contactList;
    });
  }

  //完成操作
  void _complete() async {
    //已选择的账户
    List<String> selectAccounts = [];
    //已选择的头像
    List<String> selectAvatars = [];
    //选择多个好友
    for(int i = 0; i < _contactList.length;i++){
      ContactsBeanComb contactsBeanComb = _contactList[i];
      if(contactsBeanComb.isCheck){
        String selectAccount = "";
        String selectAvatar = "";
        if(account == contactsBeanComb.toAccount){
          selectAccount = contactsBeanComb.fromAccount??"";
        } else {
          selectAccount = contactsBeanComb.toAccount??"";
        }

        selectAvatar = contactsBeanComb.avatar;
        selectAccounts.add(selectAccount);
        selectAvatars.add(selectAvatar);
      }
    }
    if(selectAccounts.isEmpty){
      CommonToast.show(context, "请选择一个好友!");
      return;
    }

    LoadingDialogUtils.showLoadingDialog(context, msg: "请稍后...");

    selectAvatars.add(_userBean?.avatar??"");
    selectAccounts.add(account);

    int max = 1000000000;
    int ran = Random().nextInt(max) + max;
    String groupId = "g${ran}";


    //创建群
    bool isSuccess = await XmppManager.getInstance().createMUC(groupId, true);

    if(isSuccess){
      String addTime = WnDateUtils.getCurrentTime();

      //加入群
      await XmppManager.getInstance().joinMucGroup(groupId);

      GroupBean groupBean = GroupBean(groupId: groupId, groupName: groupId, avatar: "", addTime: addTime);
      GroupRepository.getInstance().insertGroup(groupBean);
      //邀请好友入群
      await XmppManager.getInstance().addMembersInGroup(groupId, selectAccounts);

      List<GroupUserBean> groupUserList = [];
      GroupUserBean groupUserBean = GroupUserBean(groupId: groupId, account: account, accountType: GroupUserBean.ACCOUNT_TYPE_OWNER, addTime: addTime);
      LogUtils.d("添加群主:${groupUserBean.toJson()}");
      //插入群主到本地数据库
      GroupUserRepository.getInstance().insertGroupUser(groupUserBean);

      groupUserList.add(groupUserBean);
      selectAccounts.forEach((selectAccount) {
        if(selectAccount != account){
          //只添加群员
          GroupUserBean groupUserBean2 = GroupUserBean(groupId: groupId, account: selectAccount, accountType: GroupUserBean.ACCOUNT_TYPE_MEMBER, addTime: addTime);
          LogUtils.d("添加成员:${groupUserBean2.toJson()}");
          //插入群员到本地数据库
          GroupUserRepository.getInstance().insertGroupUser(groupUserBean2);
          groupUserList.add(groupUserBean2);
        }
      });

      await GroupRepository.getInstance().insertGroupServer(groupBean);
      await GroupUserRepository.getInstance().insertGroupUserServer(groupUserList);
      await ImageUtils.processMergeAvatarImage(groupId, selectAvatars);
      LoadingDialogUtils.dimissLoadingDialog(context);

      Navigator.pop(context);
      Navigator.pushNamed(context, Routes.group_chat_main, arguments: {
        "groupId":groupId   //参数map
      });
    } else {
      LoadingDialogUtils.dimissLoadingDialog(context);
      CommonToast.show(context, "创建群聊失败!");
    }

  }

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: WnAppBar.getAppBar(context, Text("发起群聊")),

      body: Column(
        children: [
          SizedBox(height: 10,),

          Container(
            child: Text("请选择好友", style: TextStyle(fontSize: 22, color: Colors.black54, fontWeight: FontWeight.bold),),
          ),

          Expanded(
              child:ListView.builder(
                  itemCount: _contactList.length,
                  controller: _scrollController,
                  itemBuilder: (context, index) {
                    return InkWell(

                      onLongPress: (){
                        LogUtils.d("长按。${index}");

                      },
                      onTap: (){
                        //_goDetails(_contactList[index]);
                      },
                      child: Container(
                        decoration: BoxDecoration(border: Border(bottom:BorderSide(color: Color(0xffd9d9d9), width: 0.3))),
                        padding: EdgeInsets.only(left: 14, top: 10, bottom: 10),
                        child: Row(
                          children: [
                            CommonAvatarView.showBaseImage(_contactList[index].avatar, 44, 44),
                            SizedBox(width: 12,),
                            Text(_contactList[index].nickName, maxLines: 1,style: TextStyle(fontSize: 18, color: Colors.black, fontWeight: FontWeight.bold),),

                            Expanded(child: Text("")),
                            Checkbox(value: _contactList[index].isCheck, onChanged: (isCheck){
                              //LogUtils.d("点击:${isCheck}");
                              _contactList[index].isCheck = isCheck!;
                              setState(() {
                              });
                            }),
                          ],
                        ),
                      ),
                    );
                  })

          ),

          Container(
            alignment: Alignment.centerRight,
            margin: EdgeInsets.only(right: 12, bottom: 6),
            child: ElevatedButton(
                style: ElevatedButton.styleFrom(
                    backgroundColor: Colors.green,
                    textStyle: TextStyle(fontSize: 20)
                ),
                onPressed: (){
                  _complete();
                },
                child: Text("完成")
            ),
          ),

        ],
      ),
    );
  }


}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/36726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM S5PV210的启动过程

一、内存 SRAM 静态内存 特点就是容量小、价格高&#xff0c;优点是不需要软件初始化直接上电就能用。DRAM 动态内存 特点就是容量大、价格低&#xff0c;缺点就是上电后不能直接使用&#xff0c;需要软件初始化后才可以使用。 单片机中&#xff1a;内存需求量小&#xff0c;而…

秉持技术普惠的华为,致力于无处不在的联接

编辑 | 阿冒 设计 | 沐由经济学家托马斯弗里德曼在《世界是平的》一书中曾经指出&#xff1a;“科技和通信领域如闪电般迅速的进步&#xff0c;使全世界的人们可以空前地彼此接近。”然而&#xff0c;在世界各国和地区的政府工作报告中&#xff0c;“数字鸿沟”一词出现的频…

致敬最美逆行者网页设计作品 大学生抗疫感动专题网页设计作业模板 疫情感动人物静态HTML网页模板下载

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【Matlab代码】基于遗传算法和蚂蚁优化算法的路径优化问题

目录 1 概述 2 Matlab代码 3 运行结果 1 概述 在1959年&#xff0c;Dantzing 和 Ramser在经过实验和思考后&#xff0c;首次提出配送车辆路径优化问题。在物流运输中配送是重要的环节&#xff0c;准确选择配送车辆路径能有效缩短运输时间、降低运输成本、满足顾客需求等目的…

C语言 * 数组的解析 *

目录 一&#xff1a;一维数组的创建和初始化 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 二&#xff1a;二维数组的创建和初始化 2.1 数组的创建 2.2 数组的初始化 2.3 一维数组的使用 2.4 一维数组在内存中的存储 2.5 数组越…

黑苹果系统安装常见问题汇集

常见问题 黑苹果折腾之路上遇到的问题多种多样&#xff0c;这里把常见问题分为安装篇、使用篇、进阶篇。 安装篇 如何安装黑苹果&#xff1f; 目前主要有两种方式&#xff0c;第一种是推荐的方式&#xff1a;下载黑苹果安装镜像 → 刻录到U盘 → 调整配置文件 → 格式化准备…

又一款机器学习模型解释神器:LIME

在机器学习的许多应用中&#xff0c;要求用户信任模型来帮助他们做出决策。医生肯定不会仅仅因为“模型这么说”就给病人做手术。即使在风险较低的情况下&#xff0c;例如从 Netflix 选择要观看的电影时&#xff0c;在我们根据模型放弃几个小时的时间之前&#xff0c;也需要一定…

红黑树封装 map/set 及其迭代器(C++)

目录 一、map/set 的封装 1.1 封装思路 1.2 红黑树节点调整 1.3 map 和 set 的定义 1.4 仿函数 KeyOfValue 1.5 map/set 的插入 二、map/set 迭代器实现 2.1 迭代器的定义 2.2 解引用运算符重载 2.3 成员访问运算符重载 2.4 (不)等于运算符重载 2.5 begin() 与 end…

[附源码]java毕业设计智慧农业销售平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

认知电子战 | 电子战简介

1 电子战的基本概念 电子战(Electronic Warfare,EW)也叫做电子对抗(Electronic Counter Measures,ECM) 简洁定义: 电子战是为确保我方使用电磁频谱,同时阻止敌方使用电磁频谱所采取的战术与技术 完善定义: 利用电磁能、定向能、水声能等的技术手段,确定、扰乱、削弱…

Linux kprobe原理

文章目录前言一、Kprobes and Return Probes二、How Does a Kprobe Work三、Changing Execution Path四、Return Probes4.1 How Does a Return Probe Work4.2 Kretprobe entry-handler五、How Does Jump Optimization Work5.1 Init a Kprobe5.2 Safety Check5.3 Preparing Deto…

Ubuntu配置全局系统代理(常用工具配置)

Ubuntu配置全局系统代理&#xff08;常用工具&#xff09;问题描述解决方法配置系统代理终端部分配置配置apt代理配置curl,wget,pip代理git相关代理的设置配置docker代理问题描述 公司电脑网络规则做了限制&#xff0c;主机没办法通外网&#xff0c;只能通过代理连接外网。主机…

普惠联接,让人类诗意地栖居在大地上

弗里德里希荷尔德林为世间留下了一句精彩绝伦的诗句&#xff1a;“人生在世&#xff0c;成绩斐然&#xff0c;却还依然诗意地栖居在大地上。”“人&#xff0c;诗意地栖居”&#xff0c;这一命题启发了此后众多思想家、社会学家的缪斯。人之为人&#xff0c;应该如何成为存在的…

Web APIs——BOM

下面从以下7个方面介绍BOM&#xff1a; BOM概述window对象的常见事件定时器JS执行机制location对象navigator对象history对象 1. 什么是BOM&#xff1f; BOM&#xff08;Browser Object Model&#xff09;即浏览器对象模型&#xff0c;它提供了独立于内容而与浏览器窗口进行交…

谷歌FLAN-T5作者亲讲:5400亿参数,1800个任务,如何实现大语言模型“自我改进”...

2021年&#xff0c;谷歌的研究者们提出了FLAN大模型&#xff0c;其基于Instruction Tuning的方式&#xff0c;极大地提升了大语言模型的理解能力。同时&#xff0c;各种Prompting方法的涌现预示着针对大模型的下游微调将成为研究领域关注的重点。近日&#xff0c;谷歌研究者们再…

电影主题HTM5网页设计作业成品——爱影评在线电影(10页面)使用dreamweaver制作采用DIV+CSS进行布局

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

企业知识库有什么价值?

图为简道云企业知识库让雇员对知识管理深感激动的最差课堂教学 简道云知识库&#xff1a;http://s.fanruan.com/rgdrd 我们可以借助创建知识程序库应用领域知识管理方法论&#xff0c;来同时实现重新分配知识。 最终目标是让每一人都有参与 KM 的积极主动性&#xff0c; 以期…

DOAW咖啡品牌是如何生意增长的?

上海人爱喝咖啡&#xff0c;早已不是什么秘密&#xff0c;上海是中国咖啡市场的战略要地&#xff0c;以行业而论&#xff0c;咖啡赛道有星巴克、瑞幸等大品牌&#xff0c;同时也有不少新品牌不断冲击线下线上渠道&#xff0c;使这个行业内卷加速。 DOAW虽然成立时间短&#xff…

【深度学习】yolov5 tag7.0 实例分割 从0到1的体会,从模型训练,到量化完成

这里记录下yolov5 tag7.0的实例分割&#xff0c;因为也用过paddle家族的实例分割&#xff0c;能够训练出来&#xff0c;但是开放restiful api时遇到点小问题&#xff0c;还是yolov爽啊&#xff01;&#xff01;通过这篇博文&#xff0c;您可以一步步的搭建自己的分割网络。 文章…

python+SQL sever+thinter学生宿舍管理系统

pythonSQL severthinter学生宿舍管理系统一、系统介绍二、功能展示1.主页2.用户登陆3.学生信息三、数据库四、其它1.其他系统实现一、系统介绍 系统主要功能学生信息管理、管理员信息管理、核酸信息管理等。 二、功能展示 1.主页 2.用户登陆 3.学生信息 三、数据库 /*Navic…