Flutter高仿微信系列共59篇,从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。
效果图:
实现代码:
/** * Author : wangning * Email : maoning20080809@163.com * Date : 2022/8/11 12:16 * Description : 添加好友 */ Color themeDef = Color(0xffEDEDED); class AddFriends extends StatelessWidget { UserBean userBean; AddFriends({required this.userBean}); @override Widget build(BuildContext context) { return AddFriendsPage(title: '添加好友', userBean: userBean,); } } class AddFriendsPage extends StatefulWidget { UserBean userBean; AddFriendsPage({super.key, required this.title, required this.userBean}); final String title; @override StatecreateState() => _AddFriendsState(); } class _AddFriendsState extends State { @override void initState() { super.initState(); _checkAvailable(); } //检查状态, 如果不可以,先登录 void _checkAvailable() async{ var isAvailable = await XmppManager.getInstance().isAvailable(); if(!isAvailable){ String account = SpUtils.getString(CommonUtils.LOGIN_ACCOUNT); String password = SpUtils.getString(CommonUtils.LOGIN_PASSWORD); XmppManager.getInstance().connect(account, password); } } bool bCanPress = true; //添加好友 void _createRoster(String toAccount) async { if(!bCanPress){ return; } bCanPress = false; bool isNetwork = await CommonNetwork.isNetwork(); if(!isNetwork) { CommonUtils.showNetworkError(context); return; } var isAvailable = await XmppManager.getInstance().isAvailable(); LogUtils.d("连接状态:${isAvailable} , ${toAccount}"); if(!isAvailable){ _checkAvailable(); CommonToast.show(context, "添加失败,请重试!"); return; } CommonToast.show(context, "请稍后。。。"); UserBean toUserBean = await UserRepository.getInstance().getUserServer(toAccount); if(toUserBean != null){ UserRepository.getInstance().insertUserLocal(toUserBean); String account = SpUtils.getString(CommonUtils.LOGIN_ACCOUNT); String addTime = WnDateUtils.getCurrentTime(); //添加好友之前, 先删除 await ContactsRepository.getInstance().deleteContactsByAccount(account, toAccount); ContactsBean contactsBean = ContactsBean(); contactsBean.fromAccount = account; contactsBean.toAccount = toAccount; contactsBean.type = ContactsBean.typeRequest; contactsBean.addTime = addTime; ContactsRepository.getInstance().insertContactsLocal(contactsBean); ContactsRepository.getInstance().insertContactsServer(contactsBean); XmppManager.getInstance().createRoster(toAccount); //获取对方账号信息 //String message = "${CommonUtils.CHAT_CONTENT_TYPE_ADD_FRIENDS}${CommonUtils.CHAT_MESSAGE_SPILE}${account}${CommonUtils.CHAT_MESSAGE_SPILE}${addTime}"; ChatSendBean chatSendBean = ChatSendBean(); chatSendBean.contentType = CommonUtils.TYPE_ADD_FRIENDS; chatSendBean.content = account; chatSendBean.addTime = addTime; String message = jsonEncode(chatSendBean); _sendMessage(toAccount, message); CommonToast.show(context, "添加成功!"); Navigator.pop(context); } else { CommonToast.show(context, "添加失败,请重试!"); } //2秒后才可以继续点击 Future.delayed(Duration(seconds: 2), (){ bCanPress = true; }); } _sendMessage(String toAccount, var message){ int id = DateTime.now().millisecondsSinceEpoch; String account = SpUtils.getString(CommonUtils.LOGIN_ACCOUNT); String toJid = toAccount + "@wangning"; LogUtils.d("添加好友发送消息:${toJid} , ${message}"); XmppManager.getInstance().sendMessage(toJid, message, "$account", id); } String results = "";//原来的内容是空的 final TextEditingController controller = TextEditingController(text: ""); @override Widget build(BuildContext context) { return Scaffold( appBar: WnAppBar.getAppBar(context, Text("${widget.title}")), body: Column( children: [ _getAccountWidget(), _getAddFriendsWidget(), ], ), ); } //显示用户信息控件 Widget _getAccountWidget(){ String avatarUrl = widget.userBean.avatar??""; return Container( height: 140, alignment: Alignment.bottomCenter, padding: const EdgeInsets.all(10.0),//上下左右都设置边距 child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ GestureDetector( onTap: (){ Navigator.push(context, MaterialPageRoute(builder: (context) => CommonImagePreview(fileName : CommonUtils.getReallyImage(avatarUrl), isNetwork: true, defaultUrl: CommonUtils.getDefaultAvatar(),))); }, child: CommonAvatarView.showBaseImage(avatarUrl, 80, 80), ), SizedBox(width: 12), Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ Text("${widget.userBean.nickName}", style: TextStyle(fontSize: 20, color: Colors.black),), Text("账号:${widget.userBean.account}", style: TextStyle(fontSize: 16, color: Colors.black),), ], ), ], ), ); } //添加控件 Widget _getAddFriendsWidget(){ return Container( padding: const EdgeInsets.all(10.0),//上下左右都设置边距 child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ MaterialButton( color: Colors.blue, textColor: Colors.white, padding: EdgeInsets.only(left: 28, top: 8, right: 28, bottom: 8), child: Text('添加到通讯录',style: TextStyle(fontSize: 16),), onPressed: () { LogUtils.d("点击 添加到通讯录 "); _createRoster(widget.userBean.account!); }, ) ], ), ); } }