Flutter实时通信插件pubnub的使用
Flutter实时通信插件PubNub的使用
PubNub Dart SDK
pubnub
是一个用Dart编写的Flutter友好SDK,允许你连接到PubNub数据流网络,并为你的应用程序添加实时功能。
安装
使用 pub
依赖管理工具
pubnub
使用标准的 pub
工具进行包管理来分发Dart代码。要将该包添加到你的Dart或Flutter项目中,请在 pubspec.yaml
中添加 pubnub
作为依赖项。
dependencies:
pubnub: ^5.1.1
添加依赖项后,在项目的根目录(与 pubspec.yaml
同级)运行 dart pub get
命令。
使用 Git
如果你想使用最新的未发布版本的 pubnub
,可以将其作为Git包添加到 pubspec.yaml
中。
dependencies:
pubnub:
git: git://github.com/pubnub/dart.git
path: pubnub
使用本地副本
如果你想复制Dart仓库并在本地修改它,可以使用 git clone https://github.com/pubnub/dart
克隆它,然后在 pubspec.yaml
中导入它。
dependencies:
pubnub:
path: ../path-to-cloned-pubnub-repo
导入
安装 pubnub
包后,在你的应用程序中导入它。你可以选择以下两种方式之一:
// 将所有PubNub对象导入到你的命名空间
import 'package:pubnub/core.dart';
// 或者将PubNub导入到命名空间
import 'package:pubnub/pubnub.dart' as pn;
使用
Keyset
首先,创建一个 Keyset
实例:
final myKeyset = Keyset(
subscribeKey: 'demo',
publishKey: 'demo',
uuid: UUID('demo'));
Keyset
包含所有配置。如果你有PubNub账户,请替换 demo
为你从PubNub仪表板获取的密钥值。如果你没有账户,可以使用高度限速的 demo
密钥,但请注意这些密钥是公开的,不要发送任何敏感数据。
PubNub实例
接下来,实例化 PubNub
类,传递 myKeyset
作为默认密钥集。这将在任何时候方法中未传递密钥集时使用。
final pubnub = PubNub(defaultKeyset: myKeyset);
现在你可以使用 pubnub
实例发布消息、订阅频道等。
发布消息
要发布消息,使用 publish
方法。
pubnub.publish('my_channel', { 'content': 'Hello world!' });
消息可以是任何JSON可序列化的对象。如果你要向一个频道发布大量消息,可以使用 channel
抽象来获取 Channel
实例。
final myChannel = pubnub.channel('my_channel');
myChannel.publish(200);
myChannel.publish({ 'answer': 42 });
订阅频道
要订阅频道列表或频道组,使用 subscribe
方法。你需要传递一个包含频道或频道组的 Set
。
var subscription = pubnub.subscribe(channels: {'ch1', 'ch2'});
你也可以使用 Channel
实例:
var subscription = myChannel.subscribe();
这两种方法都返回一个 Subscription
。Subscription
包含一个Dart Stream
,用于接收你订阅的频道的消息。你可以像通常那样转换这个流,或者使用 listen
添加监听器。
subscription.messages.listen((envelope) {
print('${envelope.uuid} sent a message: ${envelope.payload}');
});
var envelope =
await sub.messages.firstWhere((envelope) => envelope.channel == 'ch2');
频道历史
你可以通过两种方式从频道中检索过去的消息。
使用 channel.history
如果你希望逐步获取消息,可以使用此方法。默认情况下,消息按降序(从最新到最旧)获取。
var history = myChannel.history(chunkSize: 50);
await history.more();
print(history.messages.length); // 50
await history.more();
print(history.messages.length); // 100
使用 channel.messages
如果你希望一次性获取大量消息,可以使用此方法。
var history = myChannel.messages(from: Timetoken(1234567890));
var count = await history.count();
print(count);
var messages = await history.fetch();
print(messages.length);
await history.delete(); // 注意!这将删除所有匹配的消息
多个密钥集
有两种方式同时使用多个密钥集。
使用命名密钥集
你可以将多个密钥集添加到 PubNub
实例中,并为其指定名称。
pubnub.keysets.add(myKeyset1, name: 'keyset1');
pubnub.keysets.add(myKeyset2, name: 'keyset2');
要使用命名密钥集而不是默认密钥集,可以在 pubnub
实例方法中传递其名称作为 using:
参数。
pubnub.publish('channel', 42, using: 'keyset1');
var myChannel = pubnub.channel('channel', using: 'keyset2');
使用密钥集实例
你也可以直接将密钥集实例传递给 pubnub
实例方法,而不是将其添加到 pubnub.keysets
。
pubnub.subscribe(channels: {'channel'}, keyset: myKeyset1)
示例代码
以下是一个完整的示例代码,展示了如何使用 pubnub
插件进行实时通信。
import 'package:pubnub/pubnub.dart';
void main() async {
// 创建PubNub实例并设置默认密钥集
var pubnub = PubNub(
defaultKeyset:
Keyset(subscribeKey: 'demo', publishKey: 'demo', uuid: UUID('demo')));
// 订阅频道
var subscription = pubnub.subscribe(channels: {'test'});
// 监听消息
subscription.messages.take(1).listen((envelope) async {
print(envelope.payload);
// 收到一条消息后取消订阅
await subscription.dispose();
});
// 等待3秒以确保订阅已建立
await Future.delayed(Duration(seconds: 3));
// 发布消息
await pubnub.publish('test', {'message': 'My message!'});
// 使用Channel抽象发布消息
var channel = pubnub.channel('test');
await channel.publish({'message': 'Another message'});
// 获取频道历史消息
var history = channel.messages();
var count = await history.count();
print('Messages on test channel: $count');
}
更多关于Flutter实时通信插件pubnub的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter实时通信插件pubnub的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter应用中使用PubNub进行实时通信的示例代码。这个示例展示了如何设置PubNub客户端、发布消息以及订阅消息。
首先,你需要在你的Flutter项目中添加PubNub的依赖。打开你的pubspec.yaml
文件,并添加以下依赖:
dependencies:
flutter:
sdk: flutter
pubnub: ^5.0.0 # 请确保使用最新版本
然后,运行flutter pub get
来安装依赖。
接下来,你可以在你的Flutter应用中编写以下代码来使用PubNub:
import 'package:flutter/material.dart';
import 'package:pubnub/pubnub.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter PubNub Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
PubNub _pubnub!;
List<String> _messages = [];
final String _channel = "my-channel";
final String _publishKey = "your-publish-key";
final String _subscribeKey = "your-subscribe-key";
@override
void initState() {
super.initState();
_initPubNub();
}
void _initPubNub() {
_pubnub = PubNub.builder()
.publishKey(_publishKey)
.subscribeKey(_subscribeKey)
.build();
_subscribeToChannel();
}
void _subscribeToChannel() {
_pubnub.subscribe()
.channels([_channel])
.withMessageAction((message) {
setState(() {
_messages.add(message.data as String);
});
})
.execute();
}
void _publishMessage(String message) {
_pubnub.publish()
.channel(_channel)
.message(message)
.execute()
.then((result) {
print("Message published: $result");
})
.catchError((error) {
print("Error publishing message: $error");
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter PubNub 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(
decoration: InputDecoration(labelText: 'Message'),
onSubmitted: (message) {
_publishMessage(message);
},
),
Button(
child: Text('Send'),
onPressed: () {
// You can also trigger message sending here if needed
},
),
],
),
),
);
}
}
注意:
- 替换
your-publish-key
和your-subscribe-key
为你的PubNub密钥。 - 在真实的应用中,不要将密钥硬编码在客户端代码中,最好使用环境变量或安全的密钥管理服务。
- 此示例中,
TextField
的onSubmitted
回调用于发送消息。你也可以在按钮的onPressed
回调中触发消息发送。 - 请确保你已经正确配置了PubNub的后台服务,并且你的密钥具有相应的权限。
这个示例代码展示了如何在Flutter中使用PubNub进行基本的实时通信。你可以根据需要扩展此示例,以实现更复杂的功能,如处理不同类型的消息、处理用户身份验证等。