Flutter实时通信插件signalr_dart的使用
Flutter 实时通信插件 signalr_dart 的使用
signalr_dart
是一个完整的 Dart SignalR 客户端,支持状态化的重连功能。使用这个库时,你会感到非常熟悉,因为它的 API 尽可能保持与原版相似。
我知道 Dart 中有很多其他的 SignalR 客户端,但它们要么存在问题(因为它们没有遵循 SignalR 客户端代码流),要么已被弃用或未被维护。你可以通过对比仓库与 SignalR C# 客户端 仓库来验证这一点。
该库支持所有平台,在 Windows 和浏览器上都经过了测试。
支持的传输方式:
- WebSocket
- ServerSentEvents (SSE)
- Long Polling
支持的中心协议:
- Json
- Message Pack (SSE 不支持) (使用 此包 可以处理 Message Pack)
你可以在 这里 找到完整的示例代码。还提供了一个测试服务器 这里。
TODO 列表:
- Http2
- Proxy
- 实现服务端(暂时不考虑)
示例代码
以下是一个简单的示例代码,展示如何在 Flutter 应用程序中使用 signalr_dart
插件进行实时通信。
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:signalr_dart/signalr_dart.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('SignalR Example')),
body: Center(child: Text('SignalR Test Page')),
floatingActionButton: FloatingActionButton(
onPressed: () => _connectToHub(context),
child: Icon(Icons.connect_without_contact),
),
),
);
}
Future<void> _connectToHub(BuildContext context) async {
// 创建一个新的连接
final connection = HubConnectionBuilder()
.withUrl("http://localhost:5000/hub")
.build();
try {
// 启动连接
await connection.start();
print("Connected to the hub!");
// 订阅消息事件
connection.on("ReceiveMessage", (args, _) {
print("Received message: ${jsonDecode(args[1])}");
// 显示消息
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(jsonDecode(args[1]))));
});
// 发送消息
connection.invoke("SendMessage", args: ["User1", "Hello, World!"]).then((result) {
print("Message sent!");
}).catchError((error) {
print("Failed to send message: $error");
});
} catch (e) {
print("Error during connection setup: $e");
}
}
}
代码说明
-
导入必要的包:
import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:signalr_dart/signalr_dart.dart';
-
创建主应用类:
void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('SignalR Example')), body: Center(child: Text('SignalR Test Page')), floatingActionButton: FloatingActionButton( onPressed: () => _connectToHub(context), child: Icon(Icons.connect_without_contact), ), ), ); }
-
定义
_connectToHub
方法:Future<void> _connectToHub(BuildContext context) async { // 创建一个新的连接 final connection = HubConnectionBuilder() .withUrl("http://localhost:5000/hub") .build(); try { // 启动连接 await connection.start(); print("Connected to the hub!"); // 订阅消息事件 connection.on("ReceiveMessage", (args, _) { print("Received message: ${jsonDecode(args[1])}"); // 显示消息 ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(jsonDecode(args[1])))); }); // 发送消息 connection.invoke("SendMessage", args: ["User1", "Hello, World!"]).then((result) { print("Message sent!"); }).catchError((error) { print("Failed to send message: $error"); }); } catch (e) { print("Error during connection setup: $e"); } }
更多关于Flutter实时通信插件signalr_dart的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter实时通信插件signalr_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter应用中使用signalr_dart
插件来实现实时通信的代码案例。这个插件允许你与ASP.NET Core SignalR服务器进行通信。
首先,你需要在你的Flutter项目中添加signalr_dart
依赖。在你的pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter:
sdk: flutter
signalr_dart: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
接下来,你需要配置SignalR连接并处理消息。以下是一个完整的示例,包括连接到SignalR服务器、发送消息和处理接收到的消息。
import 'package:flutter/material.dart';
import 'package:signalr_dart/signalr.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'SignalR Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: SignalRScreen(),
);
}
}
class SignalRScreen extends StatefulWidget {
@override
_SignalRScreenState createState() => _SignalRScreenState();
}
class _SignalRScreenState extends State<SignalRScreen> {
late HubConnection _hubConnection;
final TextEditingController _messageController = TextEditingController();
final List<String> _messages = [];
@override
void initState() {
super.initState();
initSignalR();
}
void initSignalR() async {
// 替换为你的SignalR服务器URL
String serverUrl = 'https://your-signalr-server-url';
_hubConnection = HubConnectionBuilder()
.withUrl(serverUrl)
.withAutomaticReconnect()
.build();
_hubConnection.onclose((error) {
print('Connection closed with error: ${error?.message}');
initSignalR(); // 尝试重新连接
});
_hubConnection.on('ReceiveMessage', (arguments) {
final message = arguments[0] as String;
setState(() {
_messages.add(message);
});
});
await _hubConnection.start();
print('Connected to SignalR server');
}
void sendMessage() async {
if (_messageController.text.isNotEmpty) {
await _hubConnection.invoke('SendMessage', _messageController.text);
_messageController.clear();
}
}
@override
void dispose() {
_hubConnection.stop();
_messageController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('SignalR Demo'),
),
body: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Expanded(
child: ListView.builder(
itemCount: _messages.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(_messages[index]),
);
},
),
),
TextField(
controller: _messageController,
decoration: InputDecoration(
labelText: 'Send a message',
border: OutlineInputBorder(),
),
onEditingComplete: sendMessage,
),
ElevatedButton(
onPressed: sendMessage,
child: Text('Send'),
),
],
),
),
);
}
}
代码说明:
- 依赖安装:在
pubspec.yaml
中添加signalr_dart
依赖。 - SignalR连接初始化:在
initSignalR
方法中初始化HubConnection
,并设置自动重连。 - 处理接收到的消息:通过
_hubConnection.on
方法监听ReceiveMessage
事件,并将接收到的消息添加到UI中。 - 发送消息:通过
_hubConnection.invoke
方法调用SendMessage
方法发送消息。 - UI构建:使用
ListView
显示接收到的消息,并提供一个TextField
和ElevatedButton
用于发送消息。
请确保你的SignalR服务器已经正确配置,并且有一个名为ReceiveMessage
的事件和一个名为SendMessage
的方法。这样,你就可以在Flutter应用中实现实时通信了。