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

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

 详情请查看

效果图:

实现代码:

/**
 * Author : wangning
 * Email : maoning20080809@163.com
 * Date : 2022/8/11 12:16
 * Description : 添加好友
 */
Color themeDef = Color(0xffEDEDED);

class AddFriends extends StatelessWidget {

  UserBean userBean;

  AddFriends({required this.userBean});

  @override
  Widget build(BuildContext context) {
    return AddFriendsPage(title: '添加好友', userBean: userBean,);
  }
}

class AddFriendsPage extends StatefulWidget {

  UserBean userBean;
  AddFriendsPage({super.key, required this.title, required this.userBean});
  final String title;

  @override
  State<AddFriendsPage> createState() => _AddFriendsState();
}

class _AddFriendsState extends State<AddFriendsPage> {

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

    _checkAvailable();
  }

  //检查状态, 如果不可以,先登录
  void _checkAvailable() async{

    var isAvailable = await XmppManager.getInstance().isAvailable();
    if(!isAvailable){
      String account = SpUtils.getString(CommonUtils.LOGIN_ACCOUNT);
      String password = SpUtils.getString(CommonUtils.LOGIN_PASSWORD);
      XmppManager.getInstance().connect(account, password);
    }
  }

  bool bCanPress = true;

  //添加好友
  void _createRoster(String toAccount) async {

    if(!bCanPress){
      return;
    }
    bCanPress = false;
    bool isNetwork = await CommonNetwork.isNetwork();
    if(!isNetwork) {
      CommonUtils.showNetworkError(context);
      return;
    }

    var isAvailable = await XmppManager.getInstance().isAvailable();
    LogUtils.d("连接状态:${isAvailable} , ${toAccount}");
    if(!isAvailable){
      _checkAvailable();
      CommonToast.show(context, "添加失败,请重试!");
      return;
    }
    CommonToast.show(context, "请稍后。。。");
    UserBean toUserBean = await UserRepository.getInstance().getUserServer(toAccount);
    if(toUserBean != null){
      UserRepository.getInstance().insertUserLocal(toUserBean);
      String account = SpUtils.getString(CommonUtils.LOGIN_ACCOUNT);
      String addTime = WnDateUtils.getCurrentTime();

      //添加好友之前, 先删除
      await ContactsRepository.getInstance().deleteContactsByAccount(account, toAccount);

      ContactsBean contactsBean  = ContactsBean();
      contactsBean.fromAccount = account;
      contactsBean.toAccount = toAccount;
      contactsBean.type = ContactsBean.typeRequest;
      contactsBean.addTime = addTime;
      ContactsRepository.getInstance().insertContactsLocal(contactsBean);
      ContactsRepository.getInstance().insertContactsServer(contactsBean);


      XmppManager.getInstance().createRoster(toAccount);
      //获取对方账号信息
      //String message = "${CommonUtils.CHAT_CONTENT_TYPE_ADD_FRIENDS}${CommonUtils.CHAT_MESSAGE_SPILE}${account}${CommonUtils.CHAT_MESSAGE_SPILE}${addTime}";

      ChatSendBean chatSendBean = ChatSendBean();
      chatSendBean.contentType = CommonUtils.TYPE_ADD_FRIENDS;
      chatSendBean.content = account;
      chatSendBean.addTime = addTime;
      String message = jsonEncode(chatSendBean);

      _sendMessage(toAccount, message);
      CommonToast.show(context, "添加成功!");
      Navigator.pop(context);
    } else {
      CommonToast.show(context, "添加失败,请重试!");
    }

    //2秒后才可以继续点击
    Future.delayed(Duration(seconds: 2), (){
      bCanPress = true;
    });

  }

  _sendMessage(String toAccount, var message){
    int id = DateTime.now().millisecondsSinceEpoch;
    String account = SpUtils.getString(CommonUtils.LOGIN_ACCOUNT);
    String toJid = toAccount + "@wangning";
    LogUtils.d("添加好友发送消息:${toJid} , ${message}");
    XmppManager.getInstance().sendMessage(toJid, message, "$account", id);
  }

  String results = "";//原来的内容是空的
  final TextEditingController controller = TextEditingController(text: "");

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: WnAppBar.getAppBar(context, Text("${widget.title}")),

      body: Column(
        children: [
          _getAccountWidget(),
          _getAddFriendsWidget(),
        ],
      ),
    );
  }

  //显示用户信息控件
  Widget _getAccountWidget(){
    String avatarUrl = widget.userBean.avatar??"";
    return Container(
      height: 140,
      alignment: Alignment.bottomCenter,
      padding: const EdgeInsets.all(10.0),//上下左右都设置边距
      child: Row(
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          GestureDetector(
            onTap: (){
              Navigator.push(context, MaterialPageRoute(builder: (context) => CommonImagePreview(fileName : CommonUtils.getReallyImage(avatarUrl), isNetwork: true, defaultUrl: CommonUtils.getDefaultAvatar(),)));
            },
            child: CommonAvatarView.showBaseImage(avatarUrl, 80, 80),
          ),
          SizedBox(width: 12),
          Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text("${widget.userBean.nickName}", style: TextStyle(fontSize: 20, color: Colors.black),),
              Text("账号:${widget.userBean.account}", style: TextStyle(fontSize: 16, color: Colors.black),),
            ],
          ),
        ],
      ),
    );
  }

  //添加控件
  Widget _getAddFriendsWidget(){
    return Container(
        padding: const EdgeInsets.all(10.0),//上下左右都设置边距
        child: Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            MaterialButton(
              color: Colors.blue,
              textColor: Colors.white,
              padding: EdgeInsets.only(left: 28, top: 8, right: 28, bottom: 8),
              child: Text('添加到通讯录',style: TextStyle(fontSize: 16),),
              onPressed: () {
                LogUtils.d("点击  添加到通讯录 ");
                _createRoster(widget.userBean.account!);
              },
            )
          ],
        ),
    );
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

六毛六66

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

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

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

打赏作者

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

抵扣说明:

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

余额充值