Flutter即时通讯插件livetalk_sdk的使用

Flutter即时通讯插件livetalk_sdk的使用

Status

目前正在进行维护并提升性能。

Running

通过在 pubspec.yaml 文件中添加以下依赖来安装插件:

dependencies:
  livetalk_sdk: ^latest_version

然后运行以下命令以更新依赖项:

flutter pub get

Configuration

在应用程序的主函数中初始化插件:

LiveTalkSdk(domainPbx: "${your domain => 提供由Omi, 联系销售人员获取}");

如果已经使用了 omikit_flutter_plugin,则您的域名为 realm 中的值。

配置说明:

  • 文件上传:我们使用了 flutter_uploader 来上传文件。您需要在项目中进行相应的配置。
  • 通知推送:我们使用了 firebase_messaging 来显示通知。您需要正确设置 Firebase。

Implement

创建聊天室

创建一个用于聊天的房间:

try {
  EasyLoading.show(); // 显示加载动画
  final result = await LiveTalkSdk.shareInstance.createRoom(
    phone: _phoneController.text, // 用户电话号码
    fullName: _userNameController.text, // 用户姓名
    uuid: _phoneController.text, // 唯一用户ID
    autoExpired: _isAutoExpired, // 是否自动过期(默认为false)
    fcm: "FCM_TOKEN", // FCM 推送令牌
    projectId: "FIREBASE_PROJECT_ID", // Firebase 项目ID
  );
  EasyLoading.dismiss(); // 隐藏加载动画

  if (result != null && mounted) {
    // 导航到聊天界面
  }
} catch (error) {
  EasyLoading.dismiss();
  if (error is LiveTalkError) {
    // 处理错误消息
    // error.message["message"] 获取错误信息
  }
}

参数说明:

  • fullname: 用户姓名。
  • phone: 用户电话号码。
  • autoExpired: 是否自动过期,默认为 false。如果为 true,房间仅在一天内有效。
  • uuid: 唯一用户ID。
  • domain: 您的域名,会在网页管理后台显示。
  • fcm: FCM 推送令牌。
  • projectId: Firebase 项目ID。

获取当前聊天室信息

获取当前聊天室的信息:

await LiveTalkSdk.shareInstance.getCurrentRoom();

// 重要字段:
// + id: 房间ID。
// + guestInfo: 客户端用户信息。
// + lastMessage: 当前房间的最后一条消息。
// + members: 房间成员,可以获取用户的名称和状态。
// + hasMember: 是否有管理员加入(`true` 表示已加入,`false` 表示等待加入)。

获取聊天历史记录

获取聊天历史记录:

await LiveTalkSdk.shareInstance.getMessageHistory(
  page: 1, // 页码
  size: 20, // 每页大小
);

// 重要字段:
// + id: 消息ID。
// + uuid: 用户唯一ID。
// + createBy: 消息发送者。
// + createDate: 消息创建时间。
// + type: 消息类型(文本/活动)。
// + memberType: 成员类型(`guest` 是客户端用户,`user` 是管理员用户,`system` 是系统用户)。
// + guestInfo: 客户端用户信息。
// + multimedias: 消息附件(如图片、视频等)。
// + template: 活动数据。
// + quoteMessage: 引用的消息。
// + reactions: 消息的反应列表。

发送文本消息

发送文本消息:

final sendingMessage = LiveTalkSendingMessage.createTxtSendMessage(
  message: _controller.text, // 消息内容
  quoteId: _repMessage?.id, // 如果需要回复某条消息,传递其ID
);

try {
  await LiveTalkSdk.shareInstance.sendMessage(sendingMessage);
  _controller.clear(); // 清空输入框
} catch (error) {
  if (error is LiveTalkError) {
    // 处理错误
  }
}

参数说明:

  • message: 消息内容(仅支持文本)。
  • quoteId: 如果需要回复某条消息,传递该消息的ID。

发送文件

发送文件:

final sendingMessage = LiveTalkSendingMessage.createTxtSendFiles(
  paths: result.paths.cast<String>(), // 文件路径列表
);

try {
  await LiveTalkSdk.shareInstance.sendMessage(sendingMessage);
} catch (error) {
  if (error is LiveTalkError) {
    // 处理错误
  }
}

// 注意事项:
// - 每个文件大小限制为50MB。
// - 支持所有常见文件类型(图片、视频、Word文档、PDF等)。
// - 如果结果成功,您会收到来自套接字的事件。
// - 新增功能:我们将返回 `taskId`,您可以使用它与回调进行比较以更新UI。

监听文件上传状态

监听文件上传进度:

final subscription = LiveTalkSdk.shareInstance.uploadFileStream.listen((event) {
  // 事件处理逻辑
});

// 注意事项:
// - 返回状态、任务ID和数据。
// - 状态: `UploadTaskStatus`(来自 `flutter_uploader`)。
// - taskId: 用于与初始ID进行比较。
// - 数据: 如果结果成功,数据即为消息。

删除消息

删除消息:

await LiveTalkSdk.shareInstance.removeMessage(id: id);

// 参数:
// - id: 消息ID。
// - 如果删除成功,您会收到来自套接字的事件。

对消息进行点赞/取消点赞

对消息进行点赞或取消点赞:

await LiveTalkSdk.shareInstance.actionOnMessage(
  content: "❤️", // 点赞内容
  id: id ?? "", // 消息ID
  action: "REACT", // 动作类型("REACT" 或 "UNREACT")
);

// 参数:
// - id: 消息ID。
// - content: 点赞内容。
// - action: "REACT" 表示点赞,"UNREACT" 表示取消点赞。

监听 WebSocket 事件

监听 WebSocket 事件:

LiveTalkSdk.shareInstance.eventStream.listen((result) {
  final event = result.eventName; // 事件名称
  final data = result.data; // 事件数据
});

// 事件说明:
// - `message`: 收到新消息,您可以在 `data` 字段中获取消息数据。
// - `someone_typing`: 管理员正在输入/停止输入消息,`isTyping` 会包含在 `data` 字段中。
// - `member_join`: 管理员加入客户聊天,您需要刷新房间信息。
// - `member_disconnect`: 管理员下线。
// - `member_connect`: 管理员上线。
// - `lt_reaction`: 某条消息被点赞,`msg_id` 和 `reactions` 会包含在 `data` 字段中。
// - `remove_message`: 删除了一条消息,`message_id` 会包含在 `data` 字段中。

示例代码

以下是完整的示例代码:

import 'dart:io';

import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:livetalk_sdk/livetalk_sdk.dart';
import 'package:livetalk_sdk_example/create_user_form_screen.dart';

Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  await Firebase.initializeApp();
  print("Handling a background message: ${message}");
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  HttpOverrides.global = MyHttpOverrides();

  LiveTalkSdk(domainPbx: "testtuanla2k1");

  await Firebase.initializeApp();
  NotificationService().init();

  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);

  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  void initState() {
    super.initState();
    EasyLoading.instance.userInteractions = false;

    FirebaseMessaging.onMessage.listen((RemoteMessage message) {
      NotificationService().showNotification(message);
    });

    FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
      print('Message clicked!');
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return GestureDetector(
      child: MaterialApp(
        theme: ThemeData.light(),
        home: const CreateUserFormScreen(),
        debugShowCheckedModeBanner: false,
        builder: EasyLoading.init(),
      ),
      onTap: () {
        if (FocusManager.instance.primaryFocus?.hasFocus == true) {
          FocusManager.instance.primaryFocus?.unfocus();
        }
      },
    );
  }
}

class MyHttpOverrides extends HttpOverrides {
  [@override](/user/override)
  HttpClient createHttpClient(SecurityContext? context) {
    return super.createHttpClient(context)
      ..badCertificateCallback = (
          X509Certificate cert,
          String host,
          int port,
          ) {
        return true;
      };
  }
}

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

1 回复

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


livetalk_sdk 是一个用于 Flutter 的即时通讯插件,可能用于实现实时聊天、音视频通话等功能。以下是如何在 Flutter 项目中使用 livetalk_sdk 的一般步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 livetalk_sdk 的依赖。假设 livetalk_sdk 已经发布到 pub.dev,你可以像这样添加依赖:

dependencies:
  flutter:
    sdk: flutter
  livetalk_sdk: ^1.0.0  # 请根据实际情况填写版本号

然后运行 flutter pub get 来获取依赖。

2. 初始化 SDK

在使用 livetalk_sdk 之前,通常需要先初始化 SDK。你可以在 main.dart 或某个初始化函数中进行初始化。

import 'package:livetalk_sdk/livetalk_sdk.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 SDK
  await LiveTalkSDK.initialize(
    appId: 'YOUR_APP_ID',  // 替换为你的 App ID
    appKey: 'YOUR_APP_KEY', // 替换为你的 App Key
  );
  
  runApp(MyApp());
}

3. 登录与用户管理

通常,即时通讯 SDK 需要用户登录才能使用。你可以使用 livetalk_sdk 提供的登录方法。

import 'package:livetalk_sdk/livetalk_sdk.dart';

Future<void> login(String userId, String token) async {
  await LiveTalkSDK.login(userId: userId, token: token);
}

4. 发送消息

使用 livetalk_sdk 发送消息的示例:

import 'package:livetalk_sdk/livetalk_sdk.dart';

Future<void> sendMessage(String targetUserId, String message) async {
  await LiveTalkSDK.sendMessage(
    targetUserId: targetUserId,
    message: message,
  );
}

5. 接收消息

你可以通过监听消息事件来接收消息。

import 'package:livetalk_sdk/livetalk_sdk.dart';

void listenForMessages() {
  LiveTalkSDK.onMessageReceived.listen((message) {
    print('Received message: ${message.content}');
  });
}

6. 音视频通话

如果 livetalk_sdk 支持音视频通话,你可以使用它来发起和接收通话。

import 'package:livetalk_sdk/livetalk_sdk.dart';

Future<void> startVideoCall(String targetUserId) async {
  await LiveTalkSDK.startVideoCall(targetUserId: targetUserId);
}

void listenForCalls() {
  LiveTalkSDK.onCallReceived.listen((call) {
    print('Incoming call from: ${call.callerId}');
    // 可以在这里处理接听或拒接逻辑
  });
}

7. 处理生命周期

在 Flutter 中,你需要注意 SDK 的生命周期管理,确保在应用退出时正确释放资源。

import 'package:livetalk_sdk/livetalk_sdk.dart';

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

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    LiveTalkSDK.dispose(); // 释放 SDK 资源
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.paused) {
      LiveTalkSDK.background(); // 应用进入后台
    } else if (state == AppLifecycleState.resumed) {
      LiveTalkSDK.foreground(); // 应用回到前台
    }
  }
}

8. 错误处理

在使用 SDK 时,确保处理可能出现的错误。

import 'package:livetalk_sdk/livetalk_sdk.dart';

Future<void> safeLogin(String userId, String token) async {
  try {
    await LiveTalkSDK.login(userId: userId, token: token);
  } catch (e) {
    print('Login failed: $e');
  }
}
回到顶部