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








![[附源码]java毕业设计智慧农业销售平台](https://img-blog.csdnimg.cn/cd344321913f45ce80756b587c5181df.png)










