Flutter实时通信插件messaging_signalr的使用
Flutter实时通信插件messaging_signalr的使用
介绍
messaging_signalr
包用于管理基于 SignalR 的消息应用程序所需的所有数据和功能。
使用方法
在 pubspec.yaml
文件中添加依赖:
dependencies:
messaging_signalr: 1.0.0
导入包:
import 'package:messaging_signalr/messaging_signalr.dart';
初始化
在使用包的功能之前,必须调用 init
函数。在初始化函数中,你需要配置服务器地址,并传递从 FirebaseMessaging
接收到的 Firebase Token(详见 firebase_messaging 包)。此外,还需要传递一些回调函数,这些回调函数将在任务成功或失败时被调用。
SignalRMessaging.init(
serverAddress: 'http://167.235.239.170:5025/Myhub', // 替换为你的 SignalR 服务器地址
firebaseToken: ConstValues.fireBaseToken, // 替换为你的 Firebase Token
onSendMessage: () {}, // 消息发送完成时调用
onGetContactInfo: () {}, // 添加新联系人后,接收联系人信息完成后调用
onGetContactInfoCanceled: (String message) { // 获取联系人信息失败时调用
print('获取联系人信息失败: $message');
},
onCreateGroup: (String message) { // 创建群组成功或已存在时调用
print('创建群组结果: $message');
},
);
示例代码
以下是一个完整的示例,展示如何使用 messaging_signalr
显示聊天列表。
import 'package:flutter/material.dart';
import 'package:messaging_signalr/messaging_signalr.dart';
class ChatListPage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('聊天列表'),
),
body: ListView(
children: [
...SignalRMessaging.chats.map((chat) {
return Container(
height: 65,
decoration: const BoxDecoration(
border: Border(
bottom: BorderSide(
width: 1.0,
color: Colors.black,
style: BorderStyle.solid,
),
),
),
child: Row(
children: [
// 用户头像
Container(
margin: const EdgeInsets.only(right: 8.0, left: 8.0, bottom: 8.0),
padding: const EdgeInsets.all(10),
height: 60,
width: 60,
decoration: BoxDecoration(
color: Colors.blue,
borderRadius: BorderRadius.circular(30),
),
child: FittedBox(
fit: BoxFit.fitWidth,
child: Text(
firstTwoCharsOfName(chat.userName ?? chat.chatId), // 显示用户名的前两个字符
style: const TextStyle(color: Colors.white),
),
),
),
// 聊天信息
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(bottom: 8.0),
child: Text(
chat.userName ?? chat.chatId, // 显示用户名或聊天ID
style: const TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: Colors.black,
),
),
),
Text(
chat.messages.isNotEmpty
? "${chat.messages.last.senderUserName}: ${chat.messages.last.text}" // 最近一条消息
: chat.type == ChatType.contact
? "向 ${chat.userName} 打招呼!"
: "向所有人打招呼!",
style: const TextStyle(
color: Colors.black,
),
),
],
),
),
],
),
);
}).toList(),
],
),
);
}
String firstTwoCharsOfName(String name) {
return name.length > 2 ? name.substring(0, 2) : name;
}
}
更多关于Flutter实时通信插件messaging_signalr的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter实时通信插件messaging_signalr的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
messaging_signalr
是一个用于在 Flutter 应用中实现实时通信的插件,它基于 SignalR 协议。SignalR 是一个由 Microsoft 开发的库,用于在 Web 应用中实现实时通信功能,通常用于实现服务器与客户端之间的双向通信。
以下是如何在 Flutter 项目中使用 messaging_signalr
插件的基本步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 messaging_signalr
插件的依赖:
dependencies:
flutter:
sdk: flutter
messaging_signalr: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 导入插件
在你的 Dart 文件中导入 messaging_signalr
插件:
import 'package:messaging_signalr/messaging_signalr.dart';
3. 创建 SignalR 连接
使用 SignalR
类来创建和管理与 SignalR 服务器的连接。
final signalR = SignalR(
url: 'https://your-signalr-server-url/hub', // SignalR 服务器地址
hubName: 'YourHubName', // Hub 名称
);
4. 连接和断开连接
使用 start
方法连接到 SignalR 服务器,使用 stop
方法断开连接。
await signalR.start(); // 连接到服务器
signalR.stop(); // 断开连接
5. 发送和接收消息
使用 invoke
方法向服务器发送消息,使用 on
方法监听来自服务器的消息。
// 发送消息
signalR.invoke('SendMessage', args: ['Hello, SignalR!']);
// 监听消息
signalR.on('ReceiveMessage', (List<dynamic> args) {
print('Received message: ${args[0]}');
});
6. 处理连接状态
你可以监听连接状态的变化,以便在 UI 中显示连接状态。
signalR.onConnectionStateChanged((state) {
print('Connection state changed: $state');
});
7. 错误处理
你可以监听错误事件来处理连接或通信中的错误。
signalR.onError((error) {
print('Error: $error');
});
完整示例
以下是一个简单的完整示例,展示了如何使用 messaging_signalr
插件进行实时通信:
import 'package:flutter/material.dart';
import 'package:messaging_signalr/messaging_signalr.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: SignalRExample(),
);
}
}
class SignalRExample extends StatefulWidget {
[@override](/user/override)
_SignalRExampleState createState() => _SignalRExampleState();
}
class _SignalRExampleState extends State<SignalRExample> {
final signalR = SignalR(
url: 'https://your-signalr-server-url/hub',
hubName: 'YourHubName',
);
[@override](/user/override)
void initState() {
super.initState();
_connectToSignalR();
}
void _connectToSignalR() async {
await signalR.start();
signalR.on('ReceiveMessage', (List<dynamic> args) {
print('Received message: ${args[0]}');
});
signalR.onConnectionStateChanged((state) {
print('Connection state changed: $state');
});
signalR.onError((error) {
print('Error: $error');
});
}
void _sendMessage() {
signalR.invoke('SendMessage', args: ['Hello, SignalR!']);
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('SignalR Example'),
),
body: Center(
child: ElevatedButton(
onPressed: _sendMessage,
child: Text('Send Message'),
),
),
);
}
[@override](/user/override)
void dispose() {
signalR.stop();
super.dispose();
}
}