Flutter高仿微信系列共59篇,从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。
详情请查看
效果图:
实现代码:
/*** Author : wangning* Email : maoning20080809@163.com* Date : 2022/11/6 19:46* Description : 发起群聊*/class AddGroup extends StatefulWidget{@overrideStatecreateState() => _AddGroupState();}class _AddGroupState extends State {final ScrollController _scrollController = ScrollController(); //listview 的控制器List _contactList = [];bool isLoading = false;String account = SpUtils.getString(CommonUtils.LOGIN_ACCOUNT);UserBean? _userBean;@overridevoid initState() {super.initState();_getData();}_getData() async {List contactList = await ContactsRepository.getInstance().findAllContactsComb(account);_userBean = await UserRepository.getInstance().findUserByAccount(account);setState(() {_contactList = contactList;});}//完成操作void _complete() async {//已选择的账户List selectAccounts = [];//已选择的头像List 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 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, "创建群聊失败!");}}@overrideWidget 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("完成")),),],),);}}