Flutter WebSocket管理插件websocket_manager的使用

Flutter WebSocket管理插件websocket_manager的使用

Websocket Manager

一个支持Android和iOS的Flutter插件,用于WebSocket通信。该插件基于两个不同的原生库:iOS上的Starscream和Android上的okHttp

该插件的创建是因为我们需要在后台保持WebSocket连接活跃,而Flutter官方文档中的WebSocket实现(Flutter Cookbook WebSocket)在屏幕锁定或应用进入后台时无法保持连接。


引言

Websocket Manager 并不直接在Dart代码中操作WebSocket,而是通过Platform Channel暴露Dart API,使得Flutter应用程序可以与两个强大的原生WebSocket库进行交互。因此,所有功劳归于这些原生库。


如何安装

Android

仅当服务器没有SSL/TLS时才需要此配置

从Android P版本开始,默认情况下http请求被禁用,并且有多种配置方式。一种配置方法是显式声明接受某些主机的明文流量。

  1. 创建 res/xml/network_security_config.xml 文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">your_domain</domain>
    </domain-config>
</network-security-config>
  1. AndroidManifest.xml 中引用此文件(为测试环境添加此配置):
<application
    android:networkSecurityConfig="@xml/network_security_config"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    <activity android:name="(...)">
</application>

iOS

无需任何配置。


示例

以下是一个完整的示例代码,展示了如何使用 websocket_manager 插件来管理WebSocket连接。

import 'package:flutter/material.dart';

import 'package:websocket_manager/websocket_manager.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  // 控制WebSocket URL输入框
  final TextEditingController _urlController =
      TextEditingController(text: 'wss://echo.websocket.org');

  // 控制发送消息的输入框
  final TextEditingController _messageController = TextEditingController();

  // WebSocket管理器实例
  WebsocketManager socket;

  // 接收的消息
  String _message = '';

  // 关闭消息
  String _closeMessage = '';

  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Websocket Manager Example'),
        ),
        body: Column(
          children: <Widget>[
            // 输入WebSocket URL
            TextField(
              controller: _urlController,
            ),
            // 按钮组
            Wrap(
              children: <Widget>[
                // 配置WebSocket
                RaisedButton(
                  child: Text('CONFIG'),
                  onPressed: () => socket = WebsocketManager(_urlController.text),
                ),
                // 连接WebSocket
                RaisedButton(
                  child: Text('CONNECT'),
                  onPressed: () {
                    if (socket != null) {
                      socket.connect();
                    }
                  },
                ),
                // 断开WebSocket
                RaisedButton(
                  child: Text('CLOSE'),
                  onPressed: () {
                    if (socket != null) {
                      socket.close();
                    }
                  },
                ),
                // 监听消息
                RaisedButton(
                  child: Text('LISTEN MESSAGE'),
                  onPressed: () {
                    if (socket != null) {
                      socket.onMessage((dynamic message) {
                        print('New message: $message');
                        setState(() {
                          _message = message.toString();
                        });
                      });
                    }
                  },
                ),
                // 监听关闭事件
                RaisedButton(
                  child: Text('LISTEN DONE'),
                  onPressed: () {
                    if (socket != null) {
                      socket.onClose((dynamic message) {
                        print('Close message: $message');
                        setState(() {
                          _closeMessage = message.toString();
                        });
                      });
                    }
                  },
                ),
                // 测试Echo功能
                RaisedButton(
                  child: Text('ECHO TEST'),
                  onPressed: () => WebsocketManager.echoTest(),
                ),
              ],
            ),
            // 发送消息输入框
            TextField(
              controller: _messageController,
              decoration: InputDecoration(
                suffixIcon: IconButton(
                  icon: Icon(Icons.send),
                  onPressed: () {
                    if (socket != null) {
                      socket.send(_messageController.text);
                    }
                  },
                ),
              ),
            ),
            // 显示接收的消息
            Text('Received message:'),
            Text(_message),
            // 显示关闭消息
            Text('Close message:'),
            Text(_closeMessage),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter WebSocket管理插件websocket_manager的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter WebSocket管理插件websocket_manager的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


websocket_manager 是一个用于在 Flutter 中管理 WebSocket 连接的插件。它提供了一种简单的方式来处理 WebSocket 连接、发送消息和接收消息。以下是如何使用 websocket_manager 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 websocket_manager 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  websocket_manager: ^1.0.0

然后运行 flutter pub get 来获取依赖。

2. 导入包

在你的 Dart 文件中导入 websocket_manager 包。

import 'package:websocket_manager/websocket_manager.dart';

3. 创建 WebSocket 连接

使用 WebSocketManager 类来创建和管理 WebSocket 连接。

final webSocketManager = WebSocketManager(
  'wss://your-websocket-url',
  onMessage: (String message) {
    print('Received message: $message');
  },
  onConnected: () {
    print('WebSocket connected');
  },
  onDisconnected: () {
    print('WebSocket disconnected');
  },
  onError: (dynamic error) {
    print('WebSocket error: $error');
  },
);

webSocketManager.connect();

4. 发送消息

使用 send 方法发送消息到 WebSocket 服务器。

webSocketManager.send('Hello, WebSocket!');

5. 关闭连接

当你不再需要 WebSocket 连接时,可以调用 disconnect 方法来关闭连接。

webSocketManager.disconnect();

6. 处理消息

onMessage 回调中处理从 WebSocket 服务器接收到的消息。

webSocketManager.onMessage = (String message) {
  print('Received message: $message');
  // 在这里处理消息
};

7. 处理连接状态

你可以使用 onConnectedonDisconnected 回调来处理连接状态的变化。

webSocketManager.onConnected = () {
  print('WebSocket connected');
  // 在这里处理连接成功后的逻辑
};

webSocketManager.onDisconnected = () {
  print('WebSocket disconnected');
  // 在这里处理断开连接后的逻辑
};

8. 处理错误

使用 onError 回调来处理 WebSocket 连接中的错误。

webSocketManager.onError = (dynamic error) {
  print('WebSocket error: $error');
  // 在这里处理错误
};

完整示例

以下是一个完整的示例,展示了如何使用 websocket_manager 插件来管理 WebSocket 连接。

import 'package:flutter/material.dart';
import 'package:websocket_manager/websocket_manager.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: WebSocketExample(),
    );
  }
}

class WebSocketExample extends StatefulWidget {
  [@override](/user/override)
  _WebSocketExampleState createState() => _WebSocketExampleState();
}

class _WebSocketExampleState extends State<WebSocketExample> {
  late WebSocketManager webSocketManager;

  [@override](/user/override)
  void initState() {
    super.initState();
    webSocketManager = WebSocketManager(
      'wss://your-websocket-url',
      onMessage: (String message) {
        print('Received message: $message');
      },
      onConnected: () {
        print('WebSocket connected');
      },
      onDisconnected: () {
        print('WebSocket disconnected');
      },
      onError: (dynamic error) {
        print('WebSocket error: $error');
      },
    );
    webSocketManager.connect();
  }

  [@override](/user/override)
  void dispose() {
    webSocketManager.disconnect();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('WebSocket Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            webSocketManager.send('Hello, WebSocket!');
          },
          child: Text('Send Message'),
        ),
      ),
    );
  }
}
回到顶部