主播准备页 | 主播开播页 | 直播列表 | 观众观看页 |
![]() | ![]() | ![]() | ![]() |
flutter pubaddtencent_live_uikit
Resolving dependencies...Downloading packages.........+ tencent_live_uikit x.x.x......Changed xx dependencies!xx packages have newer versions incompatible with dependency constraints.Try `flutter pub outdated` for more information.
android/app/build.gradle 文件中配置并开启混淆规则:android {......buildTypes {release {......// 配置并开启混淆规则minifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}}
android/app/proguard-rules.pro 文件中添加以下代码,如果该文件不存在则新建一个文件:-keep class com.tencent.** { *; }
android/app/build.gradle 文件中配置开启 Multidex 支持。android {......defaultConfig {......// 开启 Multidex 支持multiDexEnabled true}}
AndroidManifest.xml 里设置 MainActivity 的 android:supportsPictureInPicture 为 true:<manifest xmlns:android="http://schemas.android.com/apk/res/android"><application><activityandroid:name=".MainActivity"android:supportsPictureInPicture="true"</activity></application></manifest>
Non-Global Symbols ,以保留所需要的全局符号信息。此配置是必需的,否则可能在运行时出现异常,无法进入房间。ios/Podfile 文件中添加以下代码:target 'xxxx' do......end......post_install do |installer|installer.pods_project.targets.each do |target|flutter_additional_ios_build_settings(target)target.build_configurations.each do |config|config.build_settings['VALID_ARCHS'] = 'arm64 arm64e x86_64'config.build_settings['VALID_ARCHS[sdk=iphonesimulator*]'] = 'x86_64'endendend
Info.plist 的第一级<dict>目录下添加以下两项,分别对应麦克风和摄像头在系统弹出授权对话框时的提示信息。<key>NSCameraUsageDescription</key><string>CallingApp需要访问您的相机权限,开启后录制的视频才会有画面</string><key>NSMicrophoneUsageDescription</key><string>CallingApp需要访问您的麦克风权限,开启后录制的视频才会有声音</string>
post_install do |installer|installer.pods_project.targets.each do |target|flutter_additional_ios_build_settings(target)target.build_configurations.each do |config|config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','PERMISSION_MICROPHONE=1','PERMISSION_CAMERA=1',]endendend

navigatorObservers 中添加 TUILiveKitNavigatorObserver.instance,用于监听页面路由变化和管理组件生命周期。localizationsDelegates 中添加相关本地化代理,确保界面文案能够根据系统语言正确显示。import 'package:tencent_live_uikit/tencent_live_uikit.dart';import 'package:atomic_x_core/atomicxcore.dart';import 'package:tuikit_atomic_x/atomicx.dart';// 您自己的APP主类class XXX extends StatefulWidget {const XXX({super.key});@overrideState<XXX> createState() => _XXXState();}class _XXXState extends State<XXX> {late final ThemeState _themeState;@overridevoid initState() {super.initState();_themeState = ThemeState();_themeState.setThemeMode(ThemeType.dark);}@overrideWidget build(BuildContext context) {return ComponentTheme(themeState: _themeState,child: MaterialApp(// 添加 TUILiveKit 导航观察者,用于监听页面路由变化和生命周期管理navigatorObservers: [TUILiveKitNavigatorObserver.instance],// 添加本地化代理,支持多语言文案显示localizationsDelegates: [...LiveKitLocalizations.localizationsDelegates,...BarrageLocalizations.localizationsDelegates,...GiftLocalizations.localizationsDelegates,],// 您APP的其他配置//......),);}}
LoginStore.shared.login 完成登录,这是使用 TUILiveKit 的关键步骤,因为只有在登录成功后才能正常使用 TUILiveKit 的各项功能,请确保相关参数配置正确:import 'package:atomic_x_core/atomicxcore.dart';//......login() async {final result = await LoginStore.shared.login(sdkAppID: 1400000001, // 请替换为开通服务控制台的 SDKAppIDuserID: 'denny', // 请替换为您的 UserIDuserSig: 'xxxxxxxxxxx', // 您可以在控制台中计算一个 UserSig 并填在这个位置);if (result.isSuccess) {debugPrint('LoginStore login success');} else {debugPrint('LoginStore login failed. code:${result.errorCode}, message:${result.errorMessage ?? ''}');}}
参数 | 类型 | 说明 |
SDKAppID | Int | |
userID | String | 当前用户的唯一 ID,仅包含英文字母、数字、连字符和下划线。为避免多端登录冲突,请勿使用 1、123 等简单 ID。 |
userSig | String | 用于腾讯云鉴权的票据。请注意: 开发环境:您可以采用本地 GenerateTestUserSig.genTestSig 函数生成 userSig 或者通过 UserSig 辅助工具 生成临时的 UserSig。生产环境:为了防止密钥泄露,请务必采用服务端生成 UserSig 的方式。详细信息请参考 服务端生成 UserSig。 |
LoginStore 提供了登录状态回调机制,方便您处理可能出现的登录异常情况,主要包括 “被踢下线” 和 “签名过期” 这两种异常状态的回调:onKickedOffline 回调通知给您,此时可以在 UI 提示用户,并调用 LoginStore.shared.login 重新登录。onUserSigExpired 回调,说明您之前给该用户签发的 userSig 已经过期了,这个时候如果当前用户在您后台的登录态依然有效,您可以让您的 app 向您的后台请求新的 userSig,并调用 LoginStore.shared.login 续签登录态。import 'dart:async';// YourLoginService 代表您负责登录的业务模块class YourLoginService {late final StreamSubscription<LoginEvent> _loginEventSubscription;void subscribeLoginStatus() {_loginEventSubscription = LoginStore.shared.loginEventStream.listen((loginEvent) {switch (loginEvent) {case LoginEvent.kickedOffline: // 用户被踢下线回调// 您的业务代码:UI 交互提示用户,然后重新登录break;case LoginEvent.loginExpired: // 用户签名过期回调// 您的业务代码:如果当前用户在您后台的登录态依然有效,// 您可以让您的 app 向您的后台请求新的 userSig,// 并调用 LoginStore.shared.login 续签登录态。break;default:break;}});}void unsubscribeLoginStatus() {_loginEventSubscription.cancel();}}
LoginStore.shared.login 调用即可,我们建议您将 LoginStore.shared.login 和 LoginStore.shared.logout 与自己的登录业务关联。Non-Global Symbols,以保留所需要的全局符号信息,否则可能在运行时出现异常,无法进入房间。文档反馈