Flutter高仿微信-第54篇-群聊-邀请好友

news2025/2/27 11:08:56

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

 详情请查看

效果图:

实现代码:

import 'package:flutter/material.dart';
import 'package:wnchat2/bean/contacts/contacts_bean_comb.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/repository/user_repository.dart';
import 'package:wnchat2/routers/routers.dart';
import 'package:wnchat2/utils/image_utils.dart';
import 'package:wnchat2/utils/loading_dialog_utils.dart';
import 'package:wnchat2/utils/wn_date_utils.dart';
import 'package:wnchat2/views/common_avatar_view.dart';

import '../common/event_bus_utils.dart';
import '../repository/contacts_repository.dart';
import '../repository/group_user_repository.dart';
import '../utils/common_toast.dart';
import '../utils/log_utils.dart';


/**
 * Author : wangning
 * Email : maoning20080809@163.com
 * Date : 2022/11/6 19:46
 * Description : 添加群成员
 */

class AddGroupMember extends StatefulWidget{

  String groupId;

  AddGroupMember({required this.groupId});

  @override
  State<StatefulWidget> createState() => _AddGroupMemberState();

}

class _AddGroupMemberState extends State<AddGroupMember>{

  ScrollController _scrollController = ScrollController(); //listview 的控制器
  List<ContactsBeanComb> _contactList = [];
  bool isLoading = false;
  String account = SpUtils.getString(CommonUtils.LOGIN_ACCOUNT);

  @override
  void initState() {
    super.initState();
    _getData();
  }

  _getData() async {
    List<ContactsBeanComb> contactList = await ContactsRepository.getInstance().findAllContactsCombGroup(widget.groupId);
    setState(() {
      _contactList = contactList;
    });
  }

  //完成操作
  void _complete() async {
    //已选择的账户
    List<String> selectAccounts = [];
    //选择多个好友
    for(int i = 0; i < _contactList.length;i++){
      ContactsBeanComb contactsBeanComb = _contactList[i];
      if(contactsBeanComb.isCheck){
        String selectAccount = "";
        if(account == contactsBeanComb.toAccount){
          selectAccount = contactsBeanComb.fromAccount??"";
        } else {
          selectAccount = contactsBeanComb.toAccount??"";
        }
        selectAccounts.add(selectAccount);
      }
    }
    if(selectAccounts.isEmpty){
      CommonToast.show(context, "请选择一个好友!");
      return;
    }

    LoadingDialogUtils.showLoadingDialog(context, msg: "请稍后...");

    String addTime = WnDateUtils.getCurrentTime();

    List<GroupUserBean> groupUserList = [];
    for(int i = 0; i < selectAccounts.length; i++){
      String selectAccount = selectAccounts[i];
      if(selectAccount != account){
        //只添加群员
        GroupUserBean groupUserBean = GroupUserBean(groupId: widget.groupId, account: selectAccount, accountType: GroupUserBean.ACCOUNT_TYPE_MEMBER, addTime: addTime);
        LogUtils.d("添加成员:${groupUserBean.toJson()}");
        //插入群员到本地数据库
        await GroupUserRepository.getInstance().insertGroupUser(groupUserBean);
        groupUserList.add(groupUserBean);
      }
    }

    List<String>? avatarList =  await UserRepository.getInstance().findAvatarListByGroupId(widget.groupId);

    await GroupUserRepository.getInstance().insertGroupUserServer(groupUserList);

    //刷新群聊数据
    eventBus.emit(BaseEvent(BaseEvent.TYPE_REFRESH_GROUP, result: HashMap<String, Object>()));

    if(avatarList != null && avatarList.isNotEmpty) {
      await ImageUtils.processMergeAvatarImage(widget.groupId, avatarList);
    }

    LoadingDialogUtils.dimissLoadingDialog(context);

    CommonToast.show(context, "邀请好友成功!");
    Navigator.popUntil(context, ModalRoute.withName(Routes.group_chat_main));

  }

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: WnAppBar.getAppBar(context, Text("添加成员")),

      body: Column(
        children: [
          SizedBox(height: 10,),

          Container(
            child: Text("请选择好友", style: TextStyle(fontSize: 22, color: Colors.black54, fontWeight: FontWeight.bold),),
          ),

          Expanded(
              child:ListView.builder(

                  itemCount: _contactList.length,
                  controller: _scrollController,
                  itemBuilder: (context, index) {
                    return InkWell(

                      onLongPress: (){
                        LogUtils.d("长按。${index}");

                      },
                      onTap: (){
                        //_goDetails(_contactList[index]);
                      },
                      child: Container(
                        decoration: BoxDecoration(border: Border(bottom:BorderSide(color: Color(0xffd9d9d9), width: 0.3))),
                        padding: EdgeInsets.only(left: 14, top: 10, bottom: 10),
                        child: Row(
                          children: [
                            CommonAvatarView.showBaseImage(_contactList[index].avatar, 44, 44),
                            SizedBox(width: 12,),
                            Text(_contactList[index].nickName, maxLines: 1,style: TextStyle(fontSize: 18, color: Colors.black, fontWeight: FontWeight.bold),),

                            Expanded(child: Text("")),
                            Checkbox(value: _contactList[index].isCheck, onChanged: (isCheck){
                              //LogUtils.d("点击:${isCheck}");
                              _contactList[index].isCheck = isCheck!;
                              setState(() {

                              });
                            }),
                          ],
                        ),
                      ),
                    );
                  })

          ),

          Container(
            alignment: Alignment.centerRight,
            margin: EdgeInsets.only(right: 12, bottom: 6),
            child: ElevatedButton(
                style: ElevatedButton.styleFrom(
                    backgroundColor: Colors.green,
                    textStyle: TextStyle(fontSize: 20)
                ),
                onPressed: (){
                  _complete();
                },
                child: Text("完成")
            ),
          ),

        ],
      ),
    );
  }


}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/39235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaEE】HTML

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录前言一、HTML概述二、【HTML常见标签】1. 注释标签2. 标题标签&#xff1a;h1-h63. 段落标签&#xff1a;p4.换行标签&#xff1a;br5.【格式化标签】5. 图片标签&#xff1a;img 【单标签&#xff0c;没有结束标签】…

HTML+CSS简单漫画网页设计成品 蜡笔小新3页 大学生个人HTML网页制作作品

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

GreenPlum AOCO列存读IO原理

GreenPlum AOCO列存读IO原理GP自带AOCO列存&#xff0c;它的IO和heap表的IO是分开的。Heap表的脏数据由checkpoint或后台write进程刷写&#xff0c;也就是FlushBuffer函数调用smgrwrite。由magnetic disk storage manager管理IO模块。但是AOCO列存则是由本身进行管理&#xff0…

【信息融合】BP神经网络和DS证据理论不确定性信息融合问题【含Matlab源码 2204期】

⛄一、 D-S证据理论及解释 证据理论由Dempster在1967年最初提出,并由他的学生Shafer改进推广使之成为符合有限离散领域中推理的形式,因此称为D-S理论。证据理论讨论一个“辨识框架”(Frame of Discernment)Θ,它是关于命题的相互独立的可能答案或假设的一个有限集合。按传统方…

基于POI的可快速定制Excel导出脚本设想

基于POI的可快速定制Excel导出脚本设想 背景 年关将至&#xff0c;业务人员提出了好多比较着急但是又不常用的取数需求。所谓不常用&#xff0c;大概了是由于业务人员前期调研产生的临时需求&#xff0c;后续也不会大面积铺开&#xff0c;没必要专门分配人员去开发。所谓比较着…

诊断数据库ODX—数据库框架(基于ISO22901详解)

文章目录 前言一、ODX数据库自身架构是什么&#xff1f;二、ODX数据库架构具体组成部分和含义总结前言 车载诊断现阶段应用的诊断数据库大体分为三种&#xff1a; CDD&#xff08;Vector私有格式&#xff09;&#xff1b; ODX全球通用诊断数据库格式&#xff1b; DEXT&…

【零基础入门SpringMVC】第四期——RESTFUL专题

一、RESTFul 概述 1、什么是 RESTFul&#xff1f; REST 全称 Representational State Transfer 代表 表现层资源状态转移 视图层 控制层 表现层 百度百科这样说&#xff1a; RESTFUL是一种网络应用程序的设计风格和开发方式&#xff0c;基于HTTP&#xff0c;可以使用XML格式…

轻松应对80% 的工作场景?GitHub 爆赞的 Java 高并发与集合框架,面试官也拿我没辙

在工作中&#xff0c;笔者经常和掌握不同技术的朋友讨论具体问题的解决方案&#xff0c;发现在 Java 体系中&#xff0c;大家使用最多的是 Java 集合框架&#xff08;JCF&#xff09;和 Java 并发工具包&#xff08;JUC&#xff09;。实际上&#xff0c;JCF 和 JUC 已经能够覆盖…

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

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 实现代码&#xff1a; import package:flutter/material.dart; import package:…

Node.js 入门教程 7 从命令行运行 Node.js 脚本 8 如何退出 Node.js 程序

Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录Node.js 入门教程7 从命令行运行 Node.js 脚本8 如何退出 Node.js 程序7 从命令行运行 Node.js 脚本 运行 Node.js 程序的常用方法是&#…

【点云处理】点云法向量估计及其加速(5)

在上一篇文章【点云处理】点云法向量估计及其加速(4)中我们尝试对pcl自带的KDTree的k近邻搜索过程使用OpenMP加速&#xff0c;效果比较明显&#xff0c;有将近1倍的提速。在这篇文章中我们暂时放弃pcl自带的KDTree&#xff0c;转而使用另一大杀器nanflann库提供的KDTree。nanof…

玩链子游戏

一 游戏描述 有一条链子&#xff0c;上面有 n 颗钻石&#xff0c;钻石编号为 1&#xff5e;n 。可以对该链子执行两种操作&#xff1a; ① CUT a b c &#xff08;区间切割操作&#xff09; 切下从第 a 颗钻石到第 b 颗钻石的链子&#xff0c;把它插在剩余链子的第 c 颗钻石…

【食品加工技术】第五章 烘烤食品加工技术 笔记

【食品加工技术】第五章 烘烤食品加工技术 笔记5.1 焙烤食品概述烘烤食品的分类按发酵和膨化程度分类安装生产工艺分类烘烤食品的原料面粉糖蛋品乳及乳制品膨松剂烘烤设备常用设备恒温设备常用工具5.2 面包加工工艺和关键技术面包的分类面包的发酵原理面包的工艺流程一次发酵二…

uboot引导应用程序

uboot默认是支持执行应用程序的&#xff0c;就像引导内核一样&#xff0c;我们也可以自己写一个应用程序&#xff0c;让uboot启动时引导。 在uboot examples/standalone 目录下&#xff0c;有hello_world.c文件&#xff0c;编译uboot的时候&#xff0c;会自动编译hello_world.…

详解 InnoDB Cluster 主机名问题

详解 InnoDB Cluster 主机名问题 文章目录详解 InnoDB Cluster 主机名问题导言测试过程结论导言 因在写 【InnoDB Cluster】修改已有集群实例名称及成员实例选项 时发现主机名这块有一些问题&#xff0c;在其中进行了部分测试&#xff0c;但为使其内容精简&#xff0c;故将此部…

程序员必知的三款在线绘图工具

文章目录2.draw.io3.Lucidchart4.PrcessOn5.小结正所谓“一图胜千言”&#xff0c;无论是商务办公、PPT 演示、学习总结、技术交流、项目开发&#xff0c;我们常常都需要制作一些图表、流程图、架构图来更直观地呈现内容以及归类整理知识点。 今天就来说下程序员们常用的三款在…

【矩阵论】正规方程——生成子空间

5.1 子空间 5.1.1. 定义 设 W⊂CnW\subset C^nW⊂Cn &#xff0c;即子空间对线性组合封闭 若(1)对∀α,β∈W&#xff0c;有αβ∈W(对加法封闭)(2)对∀α∈W,∀k∈C&#xff0c;有kα∈W(对数乘封闭)\begin{aligned} 若 &(1)对\forall \alpha,\beta\in W&#xff0c;有\…

秋招失利,拿到这份“Java 高分指南(25 专题)”,金三银四翻盘有望

面试造火箭&#xff0c;工作拧螺丝&#xff01;金九银十灰溜溜地落榜&#xff0c;备受打击。正当准备明年金三银四之际&#xff0c;意外喜提朋友赠送的这“Java 高分指南&#xff08;25 专题&#xff09;”&#xff1a;Elasticsearch、微服务、Linux、JavaOOP、集合/泛型、Mysq…

Flutter高仿微信-第57篇-添加好友

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 实现代码&#xff1a; /*** Author : wangning* Email : maoning20080809163.c…