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请求被禁用,并且有多种配置方式。一种配置方法是显式声明接受某些主机的明文流量。
- 创建
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>
- 在
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
更多关于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. 处理连接状态
你可以使用 onConnected 和 onDisconnected 回调来处理连接状态的变化。
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'),
),
),
);
}
}

