Flutter即时通讯插件quickblox_sdk的使用

Flutter即时通讯插件quickblox_sdk的使用

快速开始

本指南展示了如何将Quickblox Flutter SDK连接到您的项目并开始开发。

创建一个新的应用程序在管理面板中

Quickblox应用程序包括所有将消息传递直接集成到您应用程序的功能,如聊天、视频通话、用户管理、推送通知等。要创建一个QuickBlox应用程序,请按照以下步骤操作:

  1. 注册一个新账户。输入您的电子邮件和密码进行登录。您也可以使用Google或Github账户登录。
  2. 点击“新建应用”按钮创建应用程序。
  3. 配置应用程序。在相应的字段中输入有关您组织的信息,并点击“添加”按钮。
  4. 进入凭据页面。找到“凭据”组框,复制您的“Application ID”、“Authorization Key”和“Authorization Secret”。这些数据是运行您的应用程序所需的。

将Flutter SDK安装到您的应用程序中

要从头开始创建一个带有QuickBlox SDK的Flutter聊天应用程序,请按照以下步骤操作:

  1. 安装Flutter(请根据您的平台选择合适的安装方式)。
  2. 运行flutter create myapp创建一个新的项目。
  3. 在项目的根目录下的pubspec.yaml文件中的dependencies部分添加QuickBlox SDK。
dependencies:
  quickblox_sdk: 0.16.1

发送第一条消息

初始化Quickblox SDK

使用您的应用程序凭据初始化框架。将appIdauthKeyauthSecretaccountKey传递给QB.settings.init方法,如下所示。结果是,您的应用程序详细信息将存储在服务器数据库中,并可以在后续识别。

const String APP_ID = "XXXXX";
const String AUTH_KEY = "XXXXXXXXXXXX";
const String AUTH_SECRET = "XXXXXXXXXXXX";
const String ACCOUNT_KEY = "XXXXXXXXXXXX";
const String API_ENDPOINT = ""; // 可选
const String CHAT_ENDPOINT = ""; // 可选

try {
  await QB.settings.init(APP_ID, AUTH_KEY, AUTH_SECRET, ACCOUNT_KEY,
      apiEndpoint: API_ENDPOINT, chatEndpoint: CHAT_ENDPOINT);
} on PlatformException catch (e) {
  // 发生了一些错误,查看异常消息以获取更多详细信息
}
用户授权

为了使用QuickBlox SDK的功能,您需要在服务器上授权您的应用程序,登录您的账户并创建会话。调用QB.auth.login方法并传递loginpassword参数,如下所示。

try {
  QBLoginResult result = await QB.auth.login(login, password);
  QBUser qbUser = result.qbUser;
  QBSession qbSession = result.qbSession;
} on PlatformException catch (e) {
  // 发生了一些错误,查看异常消息以获取更多详细信息
}

注意! 在调用任何SDK方法之前,必须先初始化SDK,除了初始化QuickBlox实例的方法。如果尝试在未连接的情况下调用方法,将返回错误。

连接到聊天

要连接到聊天服务器,使用以下代码片段:

try {
  await QB.chat.connect(userId, userPassword);
} on PlatformException catch (e) {
  // 发生了一些错误,查看异常消息以获取更多详细信息
}
创建对话

QuickBlox提供了三种类型的对话:1-1对话、群组对话和公共对话。

让我们创建一个1-1对话。调用QB.chat.createDialog方法并传递QBChatDialogTypes.CHAT参数作为对话类型。QBChatDialogTypes.CHAT参数允许指定两个参与者将参与对话。

try {
  QBDialog createdDialog = await QB.chat.createDialog(occupantsIds, dialogName, dialogType: dialogType);
} on PlatformException catch (e) {
  // 发生了一些错误,查看异常消息以获取更多详细信息
}
订阅接收消息

QuickBlox提供了一个聊天事件处理器,允许客户端应用程序接收聊天中发生的事件通知。因此,当对话创建后,用户可以订阅接收新消息的通知。调用QB.chat.subscribeChatEvent方法并传递QBChatEvents.RECEIVED_NEW_MESSAGE作为事件参数,如下所示。

StreamSubscription? _someSubscription;

[@override](/user/override)
void dispose() {
  if (_someSubscription != null) {
    _someSubscription!.cancel();
    _someSubscription = null;
  }
}

...

String event = QBChatEvents.RECEIVED_NEW_MESSAGE;

try {
  _someSubscription = await QB.chat.subscribeChatEvent(event, (data) {
    Map<dynamic, dynamic> map = Map<dynamic, dynamic>.from(data);
    Map<dynamic, dynamic> payload = Map<dynamic, dynamic>.from(map["payload"]);
    String? messageId = payload["id"];
  });
} on PlatformException catch (e) {
  // 发生了一些错误,查看异常消息以获取更多详细信息
}
发送消息

当对话创建后,用户可以发送消息。调用QB.chat.sendMessage方法并指定dialogIdbody参数。如果希望此消息保存在聊天历史记录中,传递saveToHistory参数。

try {
  await QB.chat.sendMessage(dialogId, body: messageBody, saveToHistory: true);
} on PlatformException catch (e) {
  // 发生了一些错误,查看异常消息以获取更多详细信息
}

完整示例Demo

以下是一个完整的示例Demo,展示了如何使用Quickblox SDK实现基本的聊天功能。

import 'package:flutter/material.dart';
import 'package:quickblox_sdk/quickblox_sdk.dart';
import 'package:quickblox_sdk/models/qb_dialog.dart';
import 'package:quickblox_sdk/models/qb_chat_message.dart';

void main() => runApp(App());

class App extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(home: MainScreen());
  }
}

class MainScreen extends StatefulWidget {
  [@override](/user/override)
  _MainScreenState createState() => _MainScreenState();
}

class _MainScreenState extends State<MainScreen> {
  final TextEditingController _messageController = TextEditingController();
  List<QBChatMessage> _messages = [];
  StreamSubscription? _chatSubscription;

  [@override](/user/override)
  void initState() {
    super.initState();
    _initializeQuickblox();
  }

  [@override](/user/override)
  void dispose() {
    if (_chatSubscription != null) {
      _chatSubscription!.cancel();
      _chatSubscription = null;
    }
    super.dispose();
  }

  Future<void> _initializeQuickblox() async {
    const String APP_ID = "YOUR_APP_ID";
    const String AUTH_KEY = "YOUR_AUTH_KEY";
    const String AUTH_SECRET = "YOUR_AUTH_SECRET";
    const String ACCOUNT_KEY = "YOUR_ACCOUNT_KEY";

    try {
      await QB.settings.init(APP_ID, AUTH_KEY, AUTH_SECRET, ACCOUNT_KEY);

      // 登录用户
      QBLoginResult loginResult = await QB.auth.login("your_login", "your_password");
      QBUser qbUser = loginResult.qbUser;
      QBSession qbSession = loginResult.qbSession;

      // 连接聊天
      await QB.chat.connect(qbUser.id, "your_password");

      // 创建1-1对话
      List<int> occupantsIds = [qbUser.id, 2]; // 假设另一个用户的ID为2
      QBDialog createdDialog = await QB.chat.createDialog(occupantsIds, "Test Dialog", dialogType: QBChatDialogTypes.CHAT);

      // 订阅接收新消息
      String event = QBChatEvents.RECEIVED_NEW_MESSAGE;
      _chatSubscription = await QB.chat.subscribeChatEvent(event, (data) {
        Map<dynamic, dynamic> map = Map<dynamic, dynamic>.from(data);
        Map<dynamic, dynamic> payload = Map<dynamic, dynamic>.from(map["payload"]);
        QBChatMessage message = QBChatMessage.fromMap(payload);
        setState(() {
          _messages.add(message);
        });
      });

      // 发送测试消息
      await QB.chat.sendMessage(createdDialog.id, body: "Hello, this is a test message!", saveToHistory: true);
    } on PlatformException catch (e) {
      print("Error: ${e.message}");
    }
  }

  void _sendMessage(String message) async {
    if (message.isNotEmpty) {
      try {
        await QB.chat.sendMessage("DIALOG_ID", body: message, saveToHistory: true);
        _messageController.clear();
      } on PlatformException catch (e) {
        print("Error sending message: ${e.message}");
      }
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Quickblox Chat Demo'),
        centerTitle: true,
      ),
      body: Column(
        children: [
          Expanded(
            child: ListView.builder(
              itemCount: _messages.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(_messages[index].body),
                  subtitle: Text("From: ${_messages[index].senderId}"),
                );
              },
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: Row(
              children: [
                Expanded(
                  child: TextField(
                    controller: _messageController,
                    decoration: InputDecoration(hintText: "Enter message"),
                  ),
                ),
                IconButton(
                  icon: Icon(Icons.send),
                  onPressed: () => _sendMessage(_messageController.text),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

更多关于Flutter即时通讯插件quickblox_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter即时通讯插件quickblox_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用quickblox_sdk进行即时通讯的示例代码。这个示例将展示如何初始化QuickBlox SDK、登录用户以及发送和接收消息。

首先,确保你已经在pubspec.yaml文件中添加了quickblox_sdk依赖:

dependencies:
  flutter:
    sdk: flutter
  quickblox_sdk: ^最新版本号

然后,运行flutter pub get来安装依赖。

接下来,我们需要进行一些初始化设置。首先,确保你已经在QuickBlox控制台中创建了应用并获取了必要的凭证(App ID, Auth Key, Auth Secret, Account Key)。

以下是一个基本的Flutter应用示例,展示如何使用quickblox_sdk

import 'package:flutter/material.dart';
import 'package:quickblox_sdk/quickblox_sdk.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  QBChatService? _chatService;
  QBUser? _currentUser;

  @override
  void initState() {
    super.initState();
    initQuickBlox();
  }

  Future<void> initQuickBlox() async {
    // Initialize QuickBlox credentials
    final String appId = '你的App ID';
    final String authKey = '你的Auth Key';
    final String authSecret = '你的Auth Secret';
    final String accountKey = '你的Account Key';

    // Configure QuickBlox
    await QBSettings.setAppId(appId);
    await QBSettings.setAuthKey(authKey);
    await QBSettings.setAuthSecret(authSecret);
    await QBSettings.setAccountKey(accountKey);

    // Create session
    final QBSessionCreationRequest request = QBSessionCreationRequest();
    final QBResponse<QBSession> response = await QBChatService.instance.createSession(request);

    if (response.success) {
      // Save current user session
      QBChatService.instance.defaultChatUser = QBChatUser(response.result!.userId, '用户名');

      // Initialize chat service
      _chatService = QBChatService.instance;

      // Add listeners for messages
      _chatService!.addMessageListener((QBChatMessage message) {
        print('Received message: ${message.body}');
      });

      // Connect to chat
      _chatService!.connect().then((bool result) {
        if (result) {
          print('Connected to chat');
        } else {
          print('Failed to connect to chat');
        }
      });
    } else {
      print('Failed to create session: ${response.error.message}');
    }
  }

  Future<void> sendMessage(String recipientId, String messageText) async {
    if (_chatService!.isConnected) {
      final QBChatMessage message = QBChatMessage();
      message.senderId = _currentUser!.id;
      message.recipientId = int.parse(recipientId);
      message.body = messageText;
      message.type = QBChatMessageType.TEXT;

      await _chatService!.sendMessage(message);
      print('Message sent: $messageText');
    } else {
      print('Chat service is not connected');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('QuickBlox Chat Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () async {
                  // Replace with actual user credentials or login logic
                  final QBUser user = QBUser();
                  user.login = 'testuser';
                  user.password = 'testpassword';
                  
                  final QBResponse<QBUser> response = await QBUsers.signIn(user);
                  if (response.success) {
                    setState(() {
                      _currentUser = response.result;
                    });
                    print('User signed in: ${_currentUser!.login}');
                  } else {
                    print('Failed to sign in: ${response.error.message}');
                  }
                },
                child: Text('Sign In'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  await sendMessage('recipient_user_id', 'Hello, this is a test message!');
                },
                child: Text('Send Message'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意事项

  1. 用户登录:在真实应用中,你需要处理用户登录逻辑,并根据QuickBlox的要求存储和管理用户会话。
  2. 消息处理:上面的代码仅展示了如何监听和发送消息。你可能需要更复杂的逻辑来处理消息接收、存储和显示。
  3. 错误处理:示例代码中的错误处理较为简单,实际应用中应添加更健壮的错误处理逻辑。
  4. UI设计:示例中的UI设计非常基础,你可以根据需求进行定制。

确保你已经正确配置了QuickBlox SDK,并替换了示例代码中的凭证和用户信息。希望这个示例能帮助你快速上手Flutter中的即时通讯开发。

回到顶部