• Flutter高仿微信-第26篇-新的朋友


    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});
    
      @override
      Widget build(BuildContext context) {
        return const NewFriendsPage(title: '新的朋友');
      }
    }
    
    class NewFriendsPage extends StatefulWidget {
      const NewFriendsPage({super.key, required this.title});
      final String title;
      @override
      State createState() => _NewFriendsPageState();
    }
    
    class _NewFriendsPageState extends State {
      final ScrollController _scrollController = ScrollController(); //listview 的控制器
      List _contactList = [];
    
      var json; //是否正在加载数据
      @override
      void 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);
      }
    
      @override
      Widget 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("");
      }
    }
  • 相关阅读:
    【Linux】 - Linux中的重定向和管道符
    java计算机毕业设计销售人员绩效管理系统源码+系统+数据库+lw文档(1)
    推荐3款卓越的 .NET 开源搜索组件库
    【教3妹学编程-算法题】购买物品的最大开销
    透明质酸偶联二硫化钼纳米片HA@MoS2|聚乙烯吡咯烷酮修饰二硫化钼PVP-MoS2|叶酸修饰二硫化钼纳米晶
    Linux内核设计与实现(十)| 页高速缓存和页回写
    Linux高性能服务器编程 学习笔记 第十章 信号
    计算机应用基础【学习笔记】
    服务器内存一般多大?(服务器内存够用吗)
    JColorChooser 和JFileChooser
  • 原文地址:https://blog.csdn.net/maoning20080808/article/details/128001117