Flutter WebSocket通信插件better_web_socket的使用
Flutter WebSocket通信插件better_web_socket的使用
安装启动
步骤1
在pubspec.yaml
文件中添加以下依赖:
dependencies:
better_web_socket: ^1.0.1
步骤2
执行安装命令:
$ flutter packages get
常规使用
以下是使用better_web_socket
的基本示例:
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
// 接收数据
void receiveData(BuildContext context) {
MyWebSocketController controller = context.read<MyWebSocketController>();
receiveDataSubscription?.cancel();
receiveDataSubscription = controller.receiveDataStream.listen((data) {
int clientRequestId = parse(data).clientRequestId; // 从服务器获取的 clientRequestId
controller.handleSendDataResponse(clientRequestId, BetterWebSocketSendDataResponseState.SUCCESS);
});
sendDataResponseStateSubscription?.cancel();
sendDataResponseStateSubscription = controller.sendDataResponseStateStream.listen((data) {
int clientRequestId = data.item1;
if (clientRequestIdList.contains(clientRequestId)) {
clientRequestIdList.remove(clientRequestId);
String result = "";
switch (data.item2) {
case BetterWebSocketSendDataResponseState.SUCCESS:
result = "发送数据成功";
break;
case BetterWebSocketSendDataResponseState.FAIL:
result = "发送数据失败";
break;
case BetterWebSocketSendDataResponseState.TIMEOUT:
result = "发送数据超时";
break;
}
print(result);
}
});
}
// 连接
void connect(BuildContext context) {
context.read<DeviceWebSocketController>().startWebSocketConnect(retryCount: double.maxFinite.toInt());
}
// 断开连接
void disconnect(BuildContext context, Duration duration) {
context.read<DeviceWebSocketController>().stopWebSocketConnectAfter(duration: duration);
}
// 发送数据
void sendData() {
context.read<DeviceWebSocketController>().sendDataAndWaitResponse(clientRequestId, data, retryCount: 3);
}
功能特性
- ✅ 自动重连
- ✅ 延迟断开连接
- ✅ 模拟HTTP请求
- ✅ 当socket连接时自动登录
示例代码
以下是完整的示例代码,展示了如何使用better_web_socket
插件。
import 'package:better_web_socket/better_web_socket.dart';
import 'package:better_web_socket_example/constant.dart';
import 'package:better_web_socket_example/normal_page.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
[@override](/user/override)
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (_) => BetterWebSocketController(serverUrl),
child: MaterialApp(
home: MainPage(),
),
);
}
}
class MainPage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('better web socket 示例应用'),
),
body: Center(
child: Container(
child: CupertinoButton(
child: Text("WebSocket 测试"),
onPressed: () {
Navigator.of(context).push(CupertinoPageRoute(
builder: (context) {
return NormalPage();
},
));
},
),
),
),
);
}
}
更多关于Flutter WebSocket通信插件better_web_socket的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter WebSocket通信插件better_web_socket的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter应用中使用better_web_socket
插件进行WebSocket通信的示例代码。这个示例展示了如何建立WebSocket连接、发送消息、接收消息以及处理连接状态变化。
首先,确保你已经在pubspec.yaml
文件中添加了better_web_socket
依赖:
dependencies:
flutter:
sdk: flutter
better_web_socket: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
接下来是示例代码:
import 'package:flutter/material.dart';
import 'package:better_web_socket/better_web_socket.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'WebSocket Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: WebSocketDemo(),
);
}
}
class WebSocketDemo extends StatefulWidget {
@override
_WebSocketDemoState createState() => _WebSocketDemoState();
}
class _WebSocketDemoState extends State<WebSocketDemo> {
BetterWebSocket? _socket;
TextEditingController _messageController = TextEditingController();
List<String> _messages = [];
@override
void initState() {
super.initState();
initWebSocket();
}
void initWebSocket() {
_socket = BetterWebSocket(
'wss://echo.websocket.org', // 替换为你的WebSocket服务器URL
onOpen: (data) {
print('WebSocket is open now. $data');
_addMessage('Connected to WebSocket server.');
},
onMessage: (data) {
print('Received message: $data');
_addMessage('Received: $data');
},
onClose: (data) {
print('WebSocket is closed now. $data');
_addMessage('Disconnected from WebSocket server.');
},
onError: (data) {
print('WebSocket error: $data');
_addMessage('Error: $data');
},
);
// 自动重连配置(可选)
_socket!.autoReconnect = true;
_socket!.reconnectInterval = Duration(seconds: 5);
_socket!.maxReconnectAttempts = 5;
}
void _sendMessage() {
if (_socket!.readyState == WebSocketReadyState.OPEN) {
String message = _messageController.text;
_socket!.send(message);
_addMessage('Sent: $message');
_messageController.clear();
} else {
_addMessage('WebSocket is not open.');
}
}
void _addMessage(String message) {
setState(() {
_messages.add(message);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('WebSocket Demo'),
),
body: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: <Widget>[
Expanded(
child: ListView.builder(
itemCount: _messages.length,
itemBuilder: (context, index) {
return Text(_messages[index]);
},
),
),
TextField(
controller: _messageController,
decoration: InputDecoration(
border: OutlineInputBorder(),
labelText: 'Enter message',
),
onSubmitted: _sendMessage,
),
ElevatedButton(
onPressed: _sendMessage,
child: Text('Send'),
),
],
),
),
);
}
@override
void dispose() {
_socket?.close();
_messageController.dispose();
super.dispose();
}
}
代码说明:
-
依赖导入:
- 导入
flutter
和better_web_socket
包。
- 导入
-
应用入口:
- 使用
MaterialApp
创建应用入口,设置主页面为WebSocketDemo
。
- 使用
-
WebSocket页面:
WebSocketDemo
是一个有状态的组件,用于管理WebSocket连接和消息显示。initState
方法中初始化WebSocket连接,并设置连接打开、收到消息、连接关闭和发生错误时的回调函数。autoReconnect
、reconnectInterval
和maxReconnectAttempts
用于配置自动重连(可选)。
-
消息发送:
_sendMessage
方法用于发送消息到WebSocket服务器,并在UI上更新已发送的消息。
-
消息显示:
- 使用
ListView.builder
动态显示接收到的消息。
- 使用
-
UI布局:
- 使用
TextField
和ElevatedButton
创建消息输入和发送按钮。
- 使用
-
资源释放:
- 在
dispose
方法中关闭WebSocket连接并释放资源。
- 在
希望这个示例能帮助你理解如何在Flutter应用中使用better_web_socket
插件进行WebSocket通信。如果有任何进一步的问题,请随时询问!