• Flutter高仿微信-第50篇-群聊-查看群成员


    Flutter高仿微信系列共59篇,从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。

     详情请查看

    效果图:

    实现代码:

    import 'package:flutter/material.dart';
    import 'package:wnchat2/bean/groupchat/group_bean.dart';
    import 'package:wnchat2/bean/groupchat/group_user_bean.dart';
    import 'package:wnchat2/common/common_utils.dart';
    import 'package:wnchat2/common/sp_utils.dart';
    import 'package:wnchat2/common/wn_app_bar.dart';
    import 'package:wnchat2/event/base_event.dart';
    import 'package:wnchat2/groupchat/group_update_name.dart';
    import 'package:wnchat2/main/contacts_details_page.dart';
    import 'package:wnchat2/repository/group_chat_repository.dart';
    import 'package:wnchat2/repository/group_repository.dart';
    import 'package:wnchat2/repository/user_repository.dart';
    import 'package:wnchat2/routers/routers.dart';
    import 'package:wnchat2/utils/loading_dialog_utils.dart';
    
    import '../bean/user/userbean.dart';
    import '../common/event_bus_utils.dart';
    import '../manager/app_manager.dart';
    import '../repository/group_user_repository.dart';
    import '../utils/log_utils.dart';
    import 'show_group_member_item.dart';
    
    /**
     * Author : wangning
     * Email : maoning20080809@163.com
     * Date : 2022/11/6 19:46
     * Description : 显示群成员
     */
    
    class ShowGroupMember extends StatefulWidget{
    
      String groupId;
    
      ShowGroupMember({required this.groupId});
    
      @override
      State createState() => _ShowGroupMemberState();
    
    }
    
    class _ShowGroupMemberState extends State{
    
      GroupBean? _groupBean;
      List _groupUserList = [];
      bool isLoading = false;
      String account = SpUtils.getString(CommonUtils.LOGIN_ACCOUNT);
    
      //每个个数宽度
      double itemWidth = 44;
      //显示个数
      int gridCount = 5;
    
      @override
      void initState() {
        super.initState();
        LogUtils.d("show_group_member 跳转的群id:${widget.groupId}");
    
        _getData();
      }
    
      _getData() async {
        _groupBean = await GroupRepository.getInstance().findGroupByGroupId(widget.groupId);
        _groupUserList = await GroupUserRepository.getInstance().findAllGroupUserByGroupId(widget.groupId)??[];
        itemWidth = AppManager.getInstance().getWidth(context) / gridCount;
    
        //如果群成员不是好友,先下载群成员个人信息到本地数据库
        for(int i = 0; i < _groupUserList.length; i++){
          GroupUserBean groupUserBean = _groupUserList[i];
           UserBean? localUserBean = await UserRepository.getInstance().findUserByAccount(groupUserBean.account??"");
            LogUtils.d("成员列表:${groupUserBean.toJson()} ");
           if(localUserBean == null){
             UserBean userBean = await UserRepository.getInstance().getUserServer(groupUserBean.account??"");
             UserRepository.getInstance().insertUserLocal(userBean);
           }
        }
    
        setState(() {
          //尾部+号
          _groupUserList?.add(GroupUserBean());
        });
      }
    
      //修改群名
      void _updateGroupName(){
        bool isOwner = false;
        for(int i = 0; i< _groupUserList.length; i++){
          GroupUserBean groupUserBean = _groupUserList[i];
          LogUtils.d("是否账号:${account}, ${groupUserBean.toJson()}");
          if(account == groupUserBean.account &&
              (groupUserBean.accountType == GroupUserBean.ACCOUNT_TYPE_OWNER||
                  groupUserBean.accountType == GroupUserBean.ACCOUNT_TYPE_ADMIN)){
            LogUtils.d("选择的账号:${account}, ${groupUserBean.toJson()}");
            isOwner = true;
            break;
          }
        }
        LogUtils.d("是否成员:${isOwner}");
        if(isOwner){
          Navigator.push(context, MaterialPageRoute(builder: (context) => GroupUpdateName(groupId: widget.groupId)));
        } else {
          LoadingDialogUtils.showTipDialog(context, msg : "当前群聊仅群主/群管理员可以修改群聊名称");
        }
    
      }
    
      //删除并退出对话框
      void _deleteAndExistDialog(){
        LoadingDialogUtils.showBaseDialog(context, msg: "确定要删除并退出吗?", clickConfirm: (){
          _deleteAndExist();
        }, clickCancel: (){
        });
      }
    
      //删除并退出
      void _deleteAndExist() async {
        LoadingDialogUtils.showLoadingContentDialog(context);
    
        String account = SpUtils.getAccount();
        List members = [account];
        GroupUserBean? groupUserBean =  await GroupUserRepository.getInstance().findGroupUserByAccountAndGroupId(account, widget.groupId);
        //清空群聊信息
        await GroupChatRepository.getInstance().deleteAllGroupChatByGroupId(widget.groupId);
        //删除群聊用户
        await GroupUserRepository.getInstance().deleteGroupUserByGroupId(account, widget.groupId);
    
        await GroupUserRepository.getInstance().deleteGroupUserByGroupIdAndAccountServer(account, widget.groupId);
    
        
        LoadingDialogUtils.dimissLoadingDialog(context);
    
        Navigator.popUntil(context, (route) {return route.isFirst;});
      }
    
      //清空聊天记录对话框
      void _cleanGroupChatDialog(){
        LoadingDialogUtils.showBaseDialog(context, msg: "确定要清空聊天记录吗?", clickConfirm: (){
          _cleanGroupChat();
        }, clickCancel: (){
        });
      }
    
      //清空聊天记录
      void _cleanGroupChat(){
        GroupChatRepository.getInstance().deleteAllGroupChatByGroupId(widget.groupId);
        //刷新聊天页面
        eventBus.emit(BaseEvent(BaseEvent.TYPE_REFRESH_GROUP, result: HashMap()));
        Navigator.pop(context);
      }
    
      @override
      Widget build(BuildContext context) {
    
        return Scaffold(
          appBar: WnAppBar.getAppBar(context, Text("聊天信息(${_groupUserList.length -1 })")),
    
          body: Column(
            children: [
              SizedBox(height: 10,),
              getImageGridView(),
              lineWidget(),
              updateGroupName(),
              lineWidget(),
              SizedBox(height: 50,),
              cleanGroupChat(),
              lineWidget(),
              deleteAndExist(),
              lineWidget(),
              SizedBox(height: 10,),
            ],
          ),
        );
      }
    
      //显示图片九宫格
      Widget getImageGridView(){
        return Expanded(
            child:GridView.builder(
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: gridCount,childAspectRatio: 1,),
              itemCount: _groupUserList.length,
              itemBuilder: (context, index){
                return InkWell(
                  onTap: (){
                    Navigator.push(context,MaterialPageRoute(builder: (context)=>ContactsDetails(toChatId: _groupUserList[index].account??"")));
                  },
                  child: Container(
                    alignment: Alignment.center,
                    margin: EdgeInsets.only(left: 3, top: 6, right: 3, bottom: 6),
                    child: showAvatarWidget(index),
                  ),
                );
              },
            )
        );
      }
    
      //修改群名称
      Widget updateGroupName() {
        return Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Expanded(
              child: InkWell(
                onTap: (){
                  _updateGroupName();
                },
                child: Container(
                  color: Colors.grey.shade300,
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [
                      Container(
                        margin: EdgeInsets.only(bottom: 15.0, top: 15, left: 12),
                        child: Text("群聊名称",style: TextStyle(fontSize: 22, color: Colors.black, fontWeight: FontWeight.bold),),
                      ),
                      Expanded(child: Text("")),
                      Container(
                        margin: EdgeInsets.only(bottom: 15.0, top: 15, right: 8),
                        child: Text("${_groupBean?.groupName}",style: TextStyle(fontSize: 22, color: Colors.grey.shade800),),
                      ),
                      Container(
                        margin: EdgeInsets.only(top:15, bottom: 15.0, right: 10.0),
                        child: Icon(Icons.chevron_right,color: Colors.grey,),
                      ),
                    ],
                  ),
                ),
              ),
            ),
          ],
        );
      }
    
    
      //清空聊天记录
      Widget cleanGroupChat(){
        return InkWell(
          onTap: (){
            _cleanGroupChatDialog();
          },
          child: Container(
            width: double.infinity,
            alignment: Alignment.center,
            margin: const EdgeInsets.only(top: 12, bottom: 12),
            child: const Text("清空聊天记录", style: TextStyle(fontSize: 20, color: Colors.red, fontWeight: FontWeight.bold),),
          ),
        );
      }
    
      //删除并退出
      Widget deleteAndExist(){
        return InkWell(
          onTap: (){
            _deleteAndExistDialog();
          },
          child: Container(
            width: double.infinity,
            alignment: Alignment.center,
            margin: EdgeInsets.only(top: 12, bottom: 12),
            child: const Text("删除并退出", style: TextStyle(fontSize: 20, color: Colors.red, fontWeight: FontWeight.bold),),
          ),
        );
      }
    
      Widget lineWidget() {
        return Container(
          width: double.infinity,
          height: 0.5,
          color: Colors.grey.shade300,
        );
      }
    
      //显示头像,最后一个显示加号图标
      Widget showAvatarWidget(int index){
        if(index == _groupUserList.length -1){
          //加号
          return InkWell(
            onTap: (){
              Navigator.pushNamed(context, Routes.add_group_member, arguments: {
                "groupId":widget.groupId  //参数map
              });
            },
            child: CommonUtils.getBaseIconPng("wc_group_chat_add"),
          );
        } else {
          GroupUserBean groupUserBean = _groupUserList[index];
          return ShowGroupMemberItem(groupUserBean: groupUserBean);
        }
    
      }
    
    
    }
  • 相关阅读:
    10-大数的基本介绍
    动手学深度学习——循环神经网络的简洁实现(代码详解)
    php 引用地址符&实现无限极分类
    【综述】推荐系统偏差问题 & 去偏最新研究进展(Bias and Debias in Recommender System)
    Android 无法mkdir()创建文件夹
    明解STM32—GPIO理论基础知识篇之寄存器原理
    OS操作系统——设备管理(测试习题)
    如何通过bat批处理实现快速生成文件目录,一键生成文件名和文件夹名目录
    c++小游戏(更新中)
    P95陷阱
  • 原文地址:https://blog.csdn.net/maoning20080808/article/details/128049246