广告
返回顶部
首页 > 资讯 > 移动开发 >AndroidFlutter基于WebSocket实现即时通讯功能
  • 560
分享到

AndroidFlutter基于WebSocket实现即时通讯功能

2024-04-02 19:04:59 560人浏览 独家记忆
摘要

目录前言联系人界面构建聊天界面的实现消息界面的 MultiProvider运行效果前言 我们在前面花了很大篇幅介绍 Provider 状态管理,这是因为在 Flu

前言

我们在前面花了很大篇幅介绍 Provider 状态管理,这是因为在 Flutter 中,Provider 是众多状态管理插件的首选。本篇以即时聊天为例,来讲述 Provider 的综合应用,也算是 Provider 状态管理系列的终结篇。本篇涉及的内容如下:

  • 联系人界面的构建;
  • 聊天界面的简单实现;
  • StreamProvider 接收 Socket流数据并自动通知界面刷新;
  • MultiProvider为聊天主界面提供多个Provider状态;
  • 多个 Provider存在交叉数据时处理方式。

联系人界面构建

我们在聊天前,需要选择对应的联系人进行单聊,因此需要构建一个联系人列表。这里我们使用简单的 ListView.builder+Mock 数据构建联系人列表。界面如下所示,其中关键的就是点击联系人时将联系人的 id通过路由传递过去,以便发送消息时通过用户 id指定接收用户。

return ListTile(
  leading: _getRoundImage(contactors[index].avatar, 50),
  title: Text(contactors[index].nickname),
  subtitle: Text(
    contactors[index].description,
    style: TextStyle(fontSize: 14.0, color: Colors.grey),
  ),
  onTap: () {
    debugPrint(contactors[index].id);
    RouterManager.router.navigateTo(context,
        '${RouterManager.chatPath}?toUserId=${contactors[index].id}');
  },
);

聊天界面的实现

我们将发送的消息放在右边,将接收到的消息放在左边,居左还是居右通过 Container 的 margin 来实现。至于区分,通过消息对象的fromUserId 来区分,如果 fromUserId 和当前用户id 一致,则是发送出去的消息,否则就是接收到的消息。在这里我们因为还没有用户体系,先将当前的用户 id 写死。为了实现模拟器之间的聊天,我们一个模拟器设置为 user1,一个设置为 user2。界面也是使用ListView.builder(万能不?)构建。

return ListView.builder(
  itemBuilder: (context, index) {
    MessageEntity message = messages[index];
    double margin = 20;
    double marginLeft = message.fromUserId == 'user1' ? 60 : margin;
    double marginRight = message.fromUserId == 'user1' ? margin : 60;
    return Container(
      margin: EdgeInsets.fromLTRB(marginLeft, margin, marginRight, margin),
      padding: EdgeInsets.all(15),
      alignment: message.fromUserId == 'user1'
          ? Alignment.centerRight
          : Alignment.centerLeft,
      decoration: BoxDecoration(
          color: message.fromUserId == 'user1'
              ? Colors.green[300]
              : Colors.blue[400],
          borderRadius: BorderRadius.circular(10)),
      child: Text(
        message.content,
        style: TextStyle(color: Colors.white),
      ),
    );
  },
  itemCount: messages.length,
);

聊天界面的一个特点是会接收StreamProvider 推送的最新的消息,为了统一,我们将接收消息和发送消息都通过StreamProvider推送更新界面。

// 发送消息时将消息加入到流控制器中
void sendMessage(String event, T message) {
  _socket.emit(event, message);
  _socketResponse.sink.add(message);
}

// 接收消息时也加入到流控制器中
_socket.on(recvEvent, (data) {
  _socketResponse.sink.add(data);
});

这样不管是接收消息还是发送消息都会通过 StreamProvider 重新构建聊天界面。那问题来了,聊天列表数据如何刷新呢?

消息界面的 MultiProvider

消息界面需要接收 StreamProvider 的消息流,还需要使用消息列表数据,这里我们使用了 MultiProvider。其中消息发送框和聊天界面共用 ChatMessageModel(仅为演示,实际可以拆分开)。

final chatMessageModel = ChatMessageModel();
//...
body: Stack(
  alignment: Alignment.bottomCenter,
  children: [
    MultiProvider(
      providers: [
        StreamProvider<Map<String, dynamic>?>(
            create: (context) => streamSocket.getResponse,
            initialData: null),
        ChangeNotifierProvider.value(value: chatMessageModel)
      ],
      child: StreamDemo(),
    ),
    ChangeNotifierProvider.value(
      child: MessageReplyBar(messageSendHandler: (message) {
        Map<String, String> JSON = {
          'fromUserId': 'user1',
          'toUserId': widget.toUserId,
          'contentType': 'text',
          'content': message
        };
        streamSocket.sendMessage('chat', json);
      }),
      value: chatMessageModel,
    ),
]

//...

其中ChatMessageModel即消息列表状态数据,里面只有一个消息对象数组和一个添加消息方法,以及一个 content 属性是给消息回复框使用的。

这里就有一个问题,StreamProvider 推送 StreamSocket过来的消息的时候, ChatMessageModel 其实是不知道的。如果要知道,一个办法就是在 StreamSocket 引用 ChatMessageModel对象,然后调用其 addMessage 方法添加消息。但是这样会增加两个类的耦合。还有一种方式是取巧的方式了,那就是 StreamdDemo的 build 方法能够获取到 StreamSocket 推送的最新消息,在这里读取到最新的消息后就可以添加到消息列表了。由于前面我们发送消息和接收消息都将消息加入到了消息流中,这样处理方式就统一了。

这种方式需要注意,Provider 不允许在组件的build 方法中再次调用类似 notifyListeners 的方法通知该组件刷新,因此在 ChatMessageModel的 addMessage 方法里不可以使用notifyListeners来通知组件刷新,否则会出现同一组件刷新冲突。实际上,因为另一个Provider 已经通知该组件刷新了,因此也没必要再通知了。当然,这仅仅是一种取巧方法,假设这个addMessage 方法还需要通知其他组件刷新,那这种形式就就不可取了。

class ChatMessageModel with ChangeNotifier {
  List<MessageEntity> _messages = [];
  List<MessageEntity> get messages => _messages;

  String content = '';

  void addMessage(Map<String, dynamic> json) {
    _messages.add(MessageEntity.fromJson(json));
  }
}

这里我们先不考虑这种情况,StreamDemo 的 build关于这部分的处理方法如下,这里对于吧 ChatMessageModel 也就不需要使用 watch 方法了,完全依赖于 StreamProvider 的流推送来更新组件。每次发送消息或接收消息后,构建时在返回组件树前就更新了消息列表数据了,因此也能保证数据是最新的。其实,相当于我们投机取巧实现了两个 Provider之间的数据交互。

@override
Widget build(BuildContext context) {
  Map<String, dynamic>? messageJson = context.watch<Map<String, dynamic>?>();
  if (messageJson != null) {
    context.read<ChatMessageModel>().addMessage(messageJson);
  }
  List<MessageEntity> messages = context.read<ChatMessageModel>().messages;
  // ListView 部分
}

运行效果

来看一下运行效果,模拟器的好处就是可以开多个调试。效果是实现了,不过实际即时聊天比这个复杂很多,而且一般也不会用 Socket,但是如果 App 内部要实现应用打开后的即时消息推送,websocket 是一个不错的选择。源码已经提交,后端和Flutter 代码分布如下:

Flutter Provider 部分代码(null safety 版本)

后端代码(Express 版本)

以上就是Android Flutter基于WEBSocket实现即时通讯功能的详细内容,更多关于Flutter WebSocket通讯的资料请关注编程网其它相关文章!

--结束END--

本文标题: AndroidFlutter基于WebSocket实现即时通讯功能

本文链接: https://www.lsjlt.com/news/143921.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • AndroidFlutter基于WebSocket实现即时通讯功能
    目录前言联系人界面构建聊天界面的实现消息界面的 MultiProvider运行效果前言 我们在前面花了很大篇幅介绍 Provider 状态管理,这是因为在 Flu...
    99+
    2022-11-13
  • Android Flutter基于WebSocket怎么实现即时通讯功能
    这篇文章主要介绍“Android Flutter基于WebSocket怎么实现即时通讯功能”,在日常操作中,相信很多人在Android Flutter基于WebSocket怎么实现即时通讯功能问题上存在疑惑,小编查阅了各...
    99+
    2023-06-29
  • SpringBoot怎么实现WebSocket即时通讯
    这篇“SpringBoot怎么实现WebSocket即时通讯”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SpringBoo...
    99+
    2023-06-30
  • 基于html5和nodejs相结合实现websocket即使通讯
    最近都在学习HTML5,做canvas游戏之类的,发现HTML5中除了canvas这个强大的工具外,还有WebSocket也很值得注意。可以用来做双屏互动游戏,何为双屏互动游戏?就是通过移动端设备来控制PC...
    99+
    2022-06-04
    通讯 nodejs websocket
  • nodejs结合Socket.IO实现websocket即时通讯
    目录为什么要用 websocketSocket.io开源项目效果预览app.jsindex.html为什么要用 websocket websocket 是一种网络通信协议,一般用来进...
    99+
    2022-11-12
  • SpringBoot+WebSocket实现即时通讯的方法详解
    目录环境信息服务端实现导入依赖创建配置类创建一个注解式的端点并在其中通过配套注解声明回调方法服务端主动发送消息给客户端客户端实现Java客户端实现在前端环境(vue)中使用webso...
    99+
    2022-11-13
  • SpringBoot实现WebSocket即时通讯的示例代码
    目录1、引入依赖2、WebSocketConfig 开启WebSocket3、WebSocketServer4、测试连接发送和接收消息5、在线测试地址6、测试截图1、引入依赖 <...
    99+
    2022-11-13
  • nodejs如何结合Socket.IO实现websocket即时通讯
    这篇文章给大家分享的是有关nodejs如何结合Socket.IO实现websocket即时通讯的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。为什么要用 websocketwebsocket 是一种网络通信协议,一...
    99+
    2023-06-25
  • 如何在PHP中实现即时通讯功能
    随着社交媒体和移动互联网的迅速发展,即时通讯(IM)已经成为人们生活中不可或缺的一部分。开发者们也开始向自己的网站或应用程序中添加IM功能,以提供更好的用户体验和互动性。PHP作为一种流行的服务器端编程语言,学会如何在其中实现IM功能可以为...
    99+
    2023-05-21
    PHP 实现 即时通讯
  • nodejs如何结合Socket.IO实现的即时通讯功能
    这篇文章主要为大家展示了“nodejs如何结合Socket.IO实现的即时通讯功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“nodejs如何结合Socket...
    99+
    2022-10-19
  • PHP实现即时通讯聊天消息发送功能
    随着互联网的不断发展,即时通讯已经成为现代社会日常沟通的主要形式,因此实现即时通讯聊天消息发送功能成为了各个网站和应用程序的必备特性。本文将介绍PHP实现即时通讯聊天消息发送功能的步骤和注意事项。一、数据库创建首先,我们需要创建一个数据库来...
    99+
    2023-05-22
    PHP 实时通讯 消息发送
  • 使用php开发Websocket,实现即时聊天功能
    使用PHP开发Websocket,实现即时聊天功能Websocket是一种全双工通信协议,适用于实时通信场景,比如即时聊天、实时数据更新等。PHP作为一种流行的服务器端编程语言,也可以通过相关库和扩展来实现Websocket功能。在本文中,...
    99+
    2023-12-09
    PHP开发 Websocket实现 即时聊天功能
  • 基于PHP实现邮件实时通知功能
    目录一、安装环境二、下载 三、 邮箱设置四、php发送邮件五、php框架中使用一、安装环境 PHPMailer 需要 PHP 的 sockets 扩展支持 另外登录 QQ ...
    99+
    2022-11-13
  • C#基于WebSocket实现聊天室功能
    本文实例为大家分享了C#基于WebSocket实现聊天室功能的具体代码,供大家参考,具体内容如下 前面两篇温习了,C# Socket内容 本章根据Socket异步聊天室修改成WebS...
    99+
    2022-11-13
  • 基于websocket的聊天功能怎么实现
    本篇内容主要讲解“基于websocket的聊天功能怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于websocket的聊天功能怎么实现”吧!   一...
    99+
    2022-10-19
  • android语音即时通讯之录音、播放功能实现代码
    在android中,实现录音与语音播放的功能算是比较简单的,但是作为参考,还是很有必要将语音相关的知识做一个简要的记录。首先,在android中,支持录音支持两种方式。主要包括:字节流模式和文件流模式。用文件流模式进行录音操作比较简单,而且...
    99+
    2023-05-30
    android 语音 通讯
  • 网站即时通讯功能的实现方法有哪些方面
    本篇内容介绍了“网站即时通讯功能的实现方法有哪些方面”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们先以聊天室为例来讲, web...
    99+
    2023-06-10
  • C语言基于单链表实现通讯录功能
    本文实例为大家分享了C语言基于单链表实现通讯录功能的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h&...
    99+
    2022-11-12
  • 微信小程序 | 基于小程序+Java+WebSocket实现实时聊天功能
    一、文章前言 此文主要实现在小程序内聊天对话功能,使用Java作为后端语言进行支持,界面友好,开发简单。 二、开发流程及工具准备 2.1、注册微信公众平台账号。 2.2、下载安装Inte...
    99+
    2023-09-06
    小程序 微信小程序 java
  • Vue怎么使用Echarts实现横向柱状图并通过WebSocket即时通讯更新
    这篇文章主要介绍“Vue怎么使用Echarts实现横向柱状图并通过WebSocket即时通讯更新”,在日常操作中,相信很多人在Vue怎么使用Echarts实现横向柱状图并通过WebSocket即时通讯更新问题上存在疑惑,小编查阅了各式资料,...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作