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<StatefulWidget> createState() => _ShowGroupMemberState();

}

class _ShowGroupMemberState extends State<ShowGroupMember>{

  GroupBean? _groupBean;
  List<GroupUserBean> _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<String> 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<String, Object>()));
    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: <Widget>[
        Expanded(
          child: InkWell(
            onTap: (){
              _updateGroupName();
            },
            child: Container(
              color: Colors.grey.shade300,
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: <Widget>[
                  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个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六毛六66

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值