# flutter_sk_pip **Repository Path**: xlvp/flutter_sk_pip ## Basic Information - **Project Name**: flutter_sk_pip - **Description**: No description available - **Primary Language**: Dart - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-08 - **Last Updated**: 2026-02-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # flutter_sk_pip 统一通话小窗插件: - Android: 系统悬浮窗(Overlay Service + 回会路由) - iOS: 应用内全局小窗(跨页面)+ 系统 PiP 兜底 业务层只接入一套 Dart API:`SkCallOverlayController + SkCallSessionAdapter`。 ## 核心 API ```dart final sk = SkCallOverlayController.instance; ``` - `initialize(onRestoreIntent: ...)` - `buildHost(child: ...)` - `startSession(adapter: ..., config: ...)` - `minimize(reason: ...)` - `restore(reason: ...)` - `endSession(reason: ...)` - `enterSystemPip()` - `snapshot` (`ValueListenable`) ## 接入步骤 1. 在 App 启动时初始化: ```dart await SkCallOverlayController.instance.initialize( onRestoreIntent: (intent) async { // 按 sessionId 幂等回会议页(push / popUntil / focus) }, ); ``` 2. 用 `buildHost` 包裹根节点(iOS 小窗挂载点): ```dart MaterialApp( builder: (context, child) { return SkCallOverlayController.instance.buildHost( child: child ?? const SizedBox.shrink(), ); }, ); ``` 3. 在会议页实现 `SkCallSessionAdapter`,并在入会后注册会话: ```dart await SkCallOverlayController.instance.startSession( adapter: adapter, config: SkCallSessionConfig( meetingArgsJson: meetingArgsJson, meetingSessionId: meetingSessionId, meetingStartedAtMs: startedAtMs, participantNamesByUid: participantNames, appId: appId, channelId: channelId, token: token, uid: uid, ), ); ``` 4. 最小化 / 回会 / 结束: ```dart await SkCallOverlayController.instance.minimize(reason: 'user_minimize'); await SkCallOverlayController.instance.restore(reason: 'user_restore'); await SkCallOverlayController.instance.endSession(reason: 'hangup'); ``` ## 所有权模型 - Android:插件原生 Overlay Service 持有 RTC(Flutter 会话通过 `SkNativeOverlayOwnershipAdapter` 让渡/恢复)。 - iOS:RTC 继续由 Dart 会话层持有;插件负责小窗、PiP、回会路由。 ## 兼容说明 - 旧 `OverlayController`/`PipController` 仍保留在插件内部桥接层。 - 业务层建议只使用统一 API,不再直接调用旧 controller。