GVKun编程网logo

Flutter web 在多个选项卡上共享相同的 websocket 连接(flutter 共享数据)

16

本文将为您提供关于Flutterweb在多个选项卡上共享相同的websocket连接的详细介绍,我们还将为您解释flutter共享数据的相关知识,同时,我们还将为您提供关于AndroidFlutter

本文将为您提供关于Flutter web 在多个选项卡上共享相同的 websocket 连接的详细介绍,我们还将为您解释flutter 共享数据的相关知识,同时,我们还将为您提供关于Android Flutter基于WebSocket实现即时通讯功能、Flask+gevent-websocket模块实现websocket、flutter socket io 连不上,原来连了一个假的 websocket 的、flutter web socket如何连接?的实用信息。

本文目录一览:

Flutter web 在多个选项卡上共享相同的 websocket 连接(flutter 共享数据)

Flutter web 在多个选项卡上共享相同的 websocket 连接(flutter 共享数据)

如何解决Flutter web 在多个选项卡上共享相同的 websocket 连接?

如何在 Flutter web 中的多个选项卡上共享相同的 web-socket 连接。

假设我在不同的选项卡中有一些命名路由: 我的网址/主 我的网址/个人资料 我的网址/连接

如何在这些选项卡之间共享相同的 web-socket 连接?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Android Flutter基于WebSocket实现即时通讯功能

Android Flutter基于WebSocket实现即时通讯功能

前言

我们在前面花了很大篇幅介绍 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通讯的资料请关注其它相关文章!

您可能感兴趣的文章:
  • 在Android中使用WebSocket实现消息通信的方法详解
  • 使用Android WebSocket实现即时通讯功能
  • Android使用Websocket实现聊天室
  • android利用websocket协议与服务器通信
  • Android使用WebSocket实现多人游戏
  • SpringBoot webSocket实现发送广播、点对点消息和Android接收
  • Android中使用WebSocket实现群聊和消息推送功能(不使用WebView)

Flask+gevent-websocket模块实现websocket

Flask+gevent-websocket模块实现websocket

后端代码:

from flask import Flask,request
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket   #这条做语法提示用

app = Flask(__name__)

@app.route(''/conn'')
def index():
    #获取请求原始数据
    user_socket = request.environ
    #获取websocket对象
    websocket_obj = user_socket[''wsgi.websocket''] #type:WebSocket

    while True:  #循环监听
        # 监听链接,接收数据
        msg = websocket_obj.receive()
        print(msg)
        websocket_obj.send(msg+''youtoo'')


if __name__ == ''__main__'':
    # app.run()
    #在APP外封装websocket
    http_serv = WSGIServer(("0.0.0.0",5000),app,handler_class=WebSocketHandler)
    # 启动服务
    http_serv.serve_forever()

模板代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>websocket客户端</title>
</head>
<body>


<script type="application/javascript">
    var ws = new WebSocket(''ws://127.0.0.1:5000/conn'');   //建立websocket链接
    //接收数据
    ws.onmessage = function (messageEvent) {
        console.log(messageEvent.data)
    }
</script>
</body>
</html>

 

flutter socket io 连不上,原来连了一个假的 websocket 的

flutter socket io 连不上,原来连了一个假的 websocket 的

OSC 请你来轰趴啦!1028 苏州源创会,一起寻宝 AI 时代

最近玩了一下 flutter。

想在在 flutter 中接入 websocket

记得 socket.io 还是比较好用的,以前还用过,客户端和服务端都有对应的配套

但是 flutter 官方的例子中,直接 clone 下来跑,却连不上

后面才知道,socket.io 是个假的 websocket。

亏我以前还用过好久时间这个框架

 

flutter web socket如何连接?

flutter web socket如何连接?

如何解决flutter web socket如何连接??

如何在 Flutter 应用中连接套接字?

连接时输出如下错误:

socket: ws://project.greatwisher.com:9006/ is not initialized!

未处理的异常:PlatformException(error,java.net.MalformedURLException: 未知协议: ws,null,java.lang.RuntimeException: java.net.MalformedURLException: 未知 协议:ws E/Flutter (22791):在 io.socket.client.Url.parse(Url.java:52)

我在套接字中使用了许多依赖项。

套接字在 Flutter 中是如何工作的?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

今天关于Flutter web 在多个选项卡上共享相同的 websocket 连接flutter 共享数据的分享就到这里,希望大家有所收获,若想了解更多关于Android Flutter基于WebSocket实现即时通讯功能、Flask+gevent-websocket模块实现websocket、flutter socket io 连不上,原来连了一个假的 websocket 的、flutter web socket如何连接?等相关知识,可以在本站进行查询。

本文标签: