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