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

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("完成")
            ),
          ),

        ],
      ),
    );
  }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六毛六66

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值