Flutter高仿微信系列共59篇,从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。
详情请查看
效果图:
实现代码:
/*** Author : wangning* Email : maoning20080809@163.com* Date : 2022/8/17 15:48* Description : 新的朋友*/ class NewFriends extends StatelessWidget {const NewFriends({super.key});@overrideWidget build(BuildContext context) {return const NewFriendsPage(title: '新的朋友');} }class NewFriendsPage extends StatefulWidget {const NewFriendsPage({super.key, required this.title});final String title;@overrideStatecreateState() => _NewFriendsPageState(); }class _NewFriendsPageState extends State {final ScrollController _scrollController = ScrollController(); //listview 的控制器List _contactList = [];var json; //是否正在加载数据@overridevoid initState() {super.initState();_updateStatus();_getData();//下面这个方法每次都底部都会执行,上面的代码只会执行一次_scrollController.addListener(() {if (_scrollController.position.pixels >_scrollController.position.maxScrollExtent - 20) {_getData();}});}//更改状态void _updateStatus() async {ContactsRepository.getInstance().updateContactStatusRead();Map result = HashMap ();eventBus.emit(BaseEvent(BaseEvent.TYPE_READ_FRIENDS, result: result));}//加载数据_getData() async {List contactList = await ContactsRepository.getInstance().findAllContactsCombNew();_contactList = [];setState(() {_contactList = contactList;});}//没有好友请求显示Widget _noDataWidget() {return Center(child: Padding(padding: EdgeInsets.all(10.0),child: Row(mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.center,children: [Text('没有新的朋友...',style: TextStyle(fontSize: 16.0),)],),),);}Future _onRefresh() async {await Future.delayed(Duration(seconds: 3), () {LogUtils.d('通讯录refresh');});}//接受好友邀请void _receiveFriends(ContactsBeanComb contactsBeanComb){XmppManager.getInstance().createRoster(contactsBeanComb.toAccount);ContactsBean contactsBean = ContactsBean();contactsBean.id = contactsBeanComb.id;contactsBean.fromAccount = contactsBeanComb.fromAccount;contactsBean.toAccount = contactsBeanComb.toAccount;contactsBean.type = ContactsBean.typeReceive;contactsBean.addTime = contactsBeanComb.addTime;ContactsRepository.getInstance().updateContactLocal(contactsBean);ContactsRepository.getInstance().updateContactServer(contactsBean);ChatSendBean chatSendBean = ChatSendBean();chatSendBean.contentType = CommonUtils.TYPE_RECEIVE_FRIENDS;chatSendBean.content = contactsBeanComb.toAccount;String message = jsonEncode(chatSendBean);_sendMessage(contactsBeanComb.fromAccount, message);Map result = HashMap ();eventBus.emit(BaseEvent(BaseEvent.TYPE_RECEIVE_FRIENDS, result: result));Navigator.pop(context);}//发送消息_sendMessage(String toAccount, var message){int id = DateTime.now().millisecondsSinceEpoch;String account = SpUtils.getString(CommonUtils.LOGIN_ACCOUNT);String toJid = toAccount + "@wangning";XmppManager.getInstance().sendMessage(toJid, message, "$account", id);}@overrideWidget build(BuildContext context) {return Scaffold(appBar: WnAppBar.getAppBar(context, Text("${widget.title}")),body: Column(children: [Expanded(child:_contactList.length > 0? RefreshIndicator(onRefresh: _onRefresh,child: ListView.builder(itemCount: _contactList.length,controller: _scrollController,itemBuilder: (context, index) {return InkWell(onLongPress: (){_showDeleteDialog(_contactList[index].fromAccount, _contactList[index].toAccount);},onTap: (){},child: Container(decoration: BoxDecoration(border: Border(bottom:BorderSide(color: Color(0xffd9d9d9), width: 0.3))),width: double.infinity,padding: EdgeInsets.only(left: 14, top: 10, bottom: 10),child: Row(children: [CommonAvatarView.showBaseImage(_contactList[index].avatar),SizedBox(width: 12,),Text(_contactList[index].nickName, maxLines: 1,style: TextStyle(fontSize: 18, color: Colors.black, fontWeight: FontWeight.bold),),SizedBox(width: 12,),Expanded(child: SizedBox()),//自动扩展挤压_getFriendsStatus(_contactList[index]),],),),);})): _noDataWidget()),],),);}//删除对话框Future _showDeleteDialog(String fromAccount, String toAccount) async {return showDialog (context: context,barrierDismissible: false,builder: (BuildContext context) {return AlertDialog(title: Text('确定要删除该好友吗?', style: new TextStyle(fontSize: 17.0)),actions: [MaterialButton(child: Text('取消'),onPressed: (){LogUtils.d("确定取消");Navigator.of(context).pop();},),MaterialButton(child: Text('确定'),onPressed: (){LogUtils.d("确定删除");Navigator.pop(context);_deleteContacts(fromAccount, toAccount);},)],);});}//删除联系人_deleteContacts(String fromAccount, String toAccount) async{bool deleteServerFlag = await ContactsRepository.getInstance().deleteContactsByAccountServer(fromAccount, toAccount);if(deleteServerFlag){bool deleteFlag = await ContactsRepository.getInstance().deleteContactsByAccount(fromAccount, toAccount);if(deleteFlag){CommonToast.show(context, "删除成功!");_getData();} else {CommonToast.show(context, "删除失败!");}} else {CommonToast.show(context, "删除失败!");}}Widget _getFriendsStatus(ContactsBeanComb contactsBeanComb){String account = SpUtils.getString(CommonUtils.LOGIN_ACCOUNT);LogUtils.d("新的朋友 _getFriendsStatus ${account} , ${contactsBeanComb.fromAccount}, ${contactsBeanComb.toAccount}");if(contactsBeanComb.fromAccount == account) {LogUtils.d("已发送");return GestureDetector(onLongPress: (){_receiveFriends(contactsBeanComb);},child: Container(margin: EdgeInsets.only(left: 12.0, right: 12),child: Text("已发送"),),);} else if(contactsBeanComb.type == ContactsBean.typeRequest||contactsBeanComb.type == ContactsBean.typeRead){LogUtils.d("同意按钮");return Container(margin: EdgeInsets.only(left: 12.0, right: 12),child: MaterialButton(color: Colors.green,textColor: Colors.white,child: Text("同意"),onPressed: (){LogUtils.d("新的朋友点击添加");_receiveFriends(contactsBeanComb);},),);}return Text("");} }