Flutter实时通信插件pubnub的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

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();

这两种方法都返回一个 SubscriptionSubscription 包含一个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

1 回复

更多关于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
              },
            ),
          ],
        ),
      ),
    );
  }
}

注意

  1. 替换your-publish-keyyour-subscribe-key为你的PubNub密钥。
  2. 在真实的应用中,不要将密钥硬编码在客户端代码中,最好使用环境变量或安全的密钥管理服务。
  3. 此示例中,TextFieldonSubmitted回调用于发送消息。你也可以在按钮的onPressed回调中触发消息发送。
  4. 请确保你已经正确配置了PubNub的后台服务,并且你的密钥具有相应的权限。

这个示例代码展示了如何在Flutter中使用PubNub进行基本的实时通信。你可以根据需要扩展此示例,以实现更复杂的功能,如处理不同类型的消息、处理用户身份验证等。

回到顶部