From 148dd2e895cc9bc47001d8a9971d98076f646f00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=AD=90=E8=B4=A4?= Date: Fri, 24 Apr 2026 17:49:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/controller/discover/room_controller.dart | 226 +--------------- lib/controller/home/home_controller.dart | 257 +++++++++++++++++++ lib/pages/mine/my_wallet_page.dart | 2 +- lib/rtc/rtc_manager.dart | 88 +------ 4 files changed, 261 insertions(+), 312 deletions(-) diff --git a/lib/controller/discover/room_controller.dart b/lib/controller/discover/room_controller.dart index d026211..228ed13 100644 --- a/lib/controller/discover/room_controller.dart +++ b/lib/controller/discover/room_controller.dart @@ -467,21 +467,6 @@ class RoomController extends GetxController with WidgetsBindingObserver { } } - final request = SSERequest( - requestType: RequestMethodType.get, - url: "${EnvConfig.mainBaseUrl}dating-agency-sse/user/sse/connect", - headers: { - "Authorization": GetStorage().read('token'), - "'X-APP-ID'": '50325897884795885' - }, - onData: (data) => print("Received: $data"), - onError: (error) => print("Error: $error"), - onDone: () => print("Stream closed"), - retry: true, // Enables automatic reconnection - ); - - final sseClient = SSEClient(); - logout() async { // 退出直播间 if (Get.isRegistered()) { @@ -522,7 +507,7 @@ class RoomController extends GetxController with WidgetsBindingObserver { GlobalData().logout(); } - final count = 3.obs; + /// 调用接口创建 RTC 频道 Future createRtcChannel() async { if (isLive.value) { @@ -565,214 +550,6 @@ class RoomController extends GetxController with WidgetsBindingObserver { ClientRoleType.clientRoleBroadcaster, ); - final Stream stream = sseClient.connect("connectionId", request); - stream.listen( - (SSEResponse response) { - print("sseData: ${response.rawResponse}"); - String raw = response.rawResponse; - if (raw.startsWith("data:")) { - String result = raw.substring(5); - print(result); - Map data = jsonDecode(result); - print(data["data"]["illegalLabel"]); - if(data["data"]["illegalHandle"] == 1){ - RTCManager.instance.publishAudio(); - - - // 隐藏 overlay - if(!isDialogShowing.value){ - SmartDialog.dismiss(); - setDialogDismiss(true); - - - - SmartDialog.show( - onDismiss: (){ - setDialogDismiss(false); - }, - builder: (context) { - return ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(16.w)), - child: Material( - color: Colors.white, - child: Container( - width: 311.w, - height: 275.w, - padding: EdgeInsets.only( - top: 25.w, - right: 25.w, - left: 25.w - ), - child: Column( - children: [ - Image.asset( - Assets.imagesLiveErrorIcon, - width: 102.w, - height: 102.w, - ), - SizedBox(height: 5.w,), - Text( - "系统提醒", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 18.w, - fontWeight: FontWeight.w700 - ), - ), - SizedBox(height: 7.w,), - Text( - "你的行为涉嫌违反平台社区规范,请注意规范言行。多次违规将会受到限制功能、封禁账号等处罚,请文明交友,理性互动。", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 14.w - ), - ), - SizedBox(height: 14.w,), - Container( - width: 188.w, - height: 40.w, - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(12.w)), - color: const Color.fromRGBO(117, 98, 249, 1) - ), - child: Center( - child: Text( - "确认", - style: TextStyle( - fontSize: 14.w, - color: Colors.white - ), - ), - ), - ).onTap(() { - - // 隐藏 overlay - SmartDialog.dismiss(); - setDialogDismiss(false); - }) - ], - ), - ), - ), - ); - }, - ); - } - } else if(data["data"]["illegalHandle"] == 2){ - SmartDialog.dismiss(); - setDialogDismiss(true); - - Future.delayed(Duration(seconds: 3), () async { - - SmartDialog.dismiss(); - - final isNotBroadcaster = currentRole != CurrentRole.broadcaster; - if (isNotBroadcaster) { - await leaveChannel(); - // 调用 LiveChatMessageService 处理结束直播消息 - LiveChatMessageService.instance.handleEndLiveMessage(); - logout(); - Get.offAll(() => LoginPage()); - } else { - if(isClose.value) return; - isClose.value = true; - await leaveChannel(); - SmartDialog.dismiss(); - if (Get.isRegistered()) { - final roomController = Get.find(); - roomController.chatMessages.clear(); - } - // 如果还没有执行 pop,手动调用 Get.back() - - final OverlayController _overlayController = Get.find(); - // 等待页面关闭后再显示小窗口,确保小窗口能正确显示 - Future.delayed(const Duration(milliseconds: 200), () { - _overlayController.hide(); - isClose.value = false; - }); - - logout(); - Get.offAll(() => LoginPage()); - - } - }); - Timer? _timer; - _timer = Timer.periodic(Duration(seconds: 1), (timer) { - count.value --; - update(); - // 👇 你的终止条件 - if (count.value == 0) { - print("满足条件,停止执行"); - timer.cancel(); // 停止 - } - }); - - SmartDialog.show( - onDismiss: (){ - setDialogDismiss(false); - _timer?.cancel(); - }, - builder: (context) { - return ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(16.w)), - child: Material( - color: Colors.white, - child: Container( - width: 311.w, - height: 275.w, - padding: EdgeInsets.only( - top: 25.w, - right: 25.w, - left: 25.w - ), - child: Column( - children: [ - Image.asset( - Assets.imagesLiveErrorIcon, - width: 102.w, - height: 102.w, - ), - SizedBox(height: 5.w,), - Text( - "账户封禁", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 18.w, - fontWeight: FontWeight.w700 - ), - ), - SizedBox(height: 7.w,), - Text( - "你的账号因 涉嫌违规,已被封禁。", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 14.w - ), - ), - SizedBox(height: 14.w,), - Obx((){ - return Text( - "${count.value}秒后返回到登录界面", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 14.w - ), - ); - }), - ], - ), - ), - ), - ); - }, - ); - } - } - }, - onError: (error) => print("SSE Error: $error"), - onDone: () => print("SSE Connection Closed"), - ); - print("sse链接"); } else { final message = base.message.isNotEmpty ? base.message : '创建频道失败'; SmartDialog.showToast(message); @@ -1017,7 +794,6 @@ class RoomController extends GetxController with WidgetsBindingObserver { channelName: channelId, message: json.encode({'type': 'end_live'}), ); - sseClient.close(connectionId: "connectionId"); } } } catch (e) { diff --git a/lib/controller/home/home_controller.dart b/lib/controller/home/home_controller.dart index 2cba5dd..a682176 100644 --- a/lib/controller/home/home_controller.dart +++ b/lib/controller/home/home_controller.dart @@ -1,11 +1,24 @@ import 'dart:async'; +import 'dart:convert'; +import 'package:dating_touchme_app/config/env_config.dart'; +import 'package:dating_touchme_app/controller/discover/room_controller.dart'; +import 'package:dating_touchme_app/controller/overlay_controller.dart'; +import 'package:dating_touchme_app/extension/ex_widget.dart'; import 'package:dating_touchme_app/generated/assets.dart'; +import 'package:dating_touchme_app/pages/mine/login_page.dart'; +import 'package:dating_touchme_app/rtc/rtc_manager.dart'; +import 'package:dating_touchme_app/service/live_chat_message_service.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_http_sse/client/sse_client.dart'; +import 'package:flutter_http_sse/enum/request_method_type_enum.dart'; +import 'package:flutter_http_sse/model/sse_request.dart'; +import 'package:flutter_http_sse/model/sse_response.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:get_storage/get_storage.dart'; import 'package:location_plugin/location_plugin.dart'; import '../../network/home_api.dart'; import '../../model/home/marriage_data.dart'; @@ -66,12 +79,256 @@ class HomeController extends GetxController { getFriendFootprintInfo(); }); + openSSE(); } + + + final count = 3.obs; + + final request = SSERequest( + requestType: RequestMethodType.get, + url: "${EnvConfig.mainBaseUrl}dating-agency-sse/user/sse/connect", + headers: { + "Authorization": GetStorage().read('token'), + "'X-APP-ID'": '50325897884795885' + }, + onData: (data) => print("Received: $data"), + onError: (error) => print("Error: $error"), + onDone: () => print("Stream closed"), + retry: true, // Enables automatic reconnection + ); + + final sseClient = SSEClient(); + + + openSSE() async { + final Stream stream = sseClient.connect("connectionId", request); + stream.listen( + (SSEResponse response) { + print("sseData: ${response.rawResponse}"); + String raw = response.rawResponse; + if (raw.startsWith("data:")) { + String result = raw.substring(5); + print(result); + Map data = jsonDecode(result); + print(data["data"]["illegalLabel"]); + if (Get.isRegistered()) { + final roomController = Get.find(); + if(data["data"]["illegalHandle"] == 1){ + RTCManager.instance.publishAudio(); + + // 隐藏 overlay + if(!roomController.isDialogShowing.value){ + SmartDialog.dismiss(); + roomController.setDialogDismiss(true); + + + + SmartDialog.show( + onDismiss: (){ + roomController.setDialogDismiss(false); + }, + builder: (context) { + return ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(16.w)), + child: Material( + color: Colors.white, + child: Container( + width: 311.w, + height: 315.w, + padding: EdgeInsets.only( + top: 25.w, + right: 25.w, + left: 25.w + ), + child: Column( + children: [ + Image.asset( + Assets.imagesLiveErrorIcon, + width: 102.w, + height: 102.w, + ), + SizedBox(height: 5.w,), + Text( + "系统提醒", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18.w, + fontWeight: FontWeight.w700 + ), + ), + SizedBox(height: 7.w,), + Text( + "你的行为涉嫌违反平台社区规范,请注意规范言行。多次违规将会受到限制功能、封禁账号等处罚,请文明交友,理性互动。", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 14.w + ), + ), + SizedBox(height: 14.w,), + Container( + width: 188.w, + height: 40.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(12.w)), + color: const Color.fromRGBO(117, 98, 249, 1) + ), + child: Center( + child: Text( + "确认", + style: TextStyle( + fontSize: 14.w, + color: Colors.white + ), + ), + ), + ).onTap(() { + + // 隐藏 overlay + SmartDialog.dismiss(); + roomController.setDialogDismiss(false); + }) + ], + ), + ), + ), + ); + }, + ); + } + } else if(data["data"]["illegalHandle"] == 2){ + SmartDialog.dismiss(); + roomController.setDialogDismiss(true); + + Future.delayed(Duration(seconds: 3), () async { + + SmartDialog.dismiss(); + + final isNotBroadcaster = roomController.currentRole != CurrentRole.broadcaster; + if (isNotBroadcaster) { + await roomController.leaveChannel(); + // 调用 LiveChatMessageService 处理结束直播消息 + LiveChatMessageService.instance.handleEndLiveMessage(); + roomController.logout(); + Get.offAll(() => LoginPage()); + } else { + if(roomController.isClose.value) return; + roomController.isClose.value = true; + await roomController.leaveChannel(); + SmartDialog.dismiss(); + if (Get.isRegistered()) { + final roomController = Get.find(); + roomController.chatMessages.clear(); + } + // 如果还没有执行 pop,手动调用 Get.back() + + final OverlayController _overlayController = Get.find(); + // 等待页面关闭后再显示小窗口,确保小窗口能正确显示 + Future.delayed(const Duration(milliseconds: 200), () { + _overlayController.hide(); + roomController.isClose.value = false; + }); + + roomController.logout(); + Get.offAll(() => LoginPage()); + + } + }); + Timer? _timer; + _timer = Timer.periodic(Duration(seconds: 1), (timer) { + count.value --; + update(); + // 👇 你的终止条件 + if (count.value == 0) { + print("满足条件,停止执行"); + timer.cancel(); // 停止 + } + }); + + SmartDialog.show( + onDismiss: (){ + roomController.setDialogDismiss(false); + _timer?.cancel(); + }, + builder: (context) { + return ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(16.w)), + child: Material( + color: Colors.white, + child: Container( + width: 311.w, + height: 275.w, + padding: EdgeInsets.only( + top: 25.w, + right: 25.w, + left: 25.w + ), + child: Column( + children: [ + Image.asset( + Assets.imagesLiveErrorIcon, + width: 102.w, + height: 102.w, + ), + SizedBox(height: 5.w,), + Text( + "账户封禁", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18.w, + fontWeight: FontWeight.w700 + ), + ), + SizedBox(height: 7.w,), + Text( + "你的账号因 涉嫌违规,已被封禁。", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 14.w + ), + ), + SizedBox(height: 14.w,), + Obx((){ + return Text( + "${count.value}秒后返回到登录界面", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 14.w + ), + ); + }), + ], + ), + ), + ), + ); + }, + ); + } + } + + } + }, + onError: (error) { + print("SSE Error: $error"); + sseClient.close(connectionId: "connectionId"); + Future.delayed(Duration(seconds: 3), () async { + + openSSE(); + }); + }, + onDone: () => print("SSE Connection Closed"), + ); + print("sse链接"); + } + + @override void onClose() { super.onClose(); _timer?.cancel(); + sseClient.close(connectionId: "connectionId"); } getFriendFootprintInfo() async { diff --git a/lib/pages/mine/my_wallet_page.dart b/lib/pages/mine/my_wallet_page.dart index 410c1dd..a114083 100644 --- a/lib/pages/mine/my_wallet_page.dart +++ b/lib/pages/mine/my_wallet_page.dart @@ -261,7 +261,7 @@ class MyWalletPage extends StatelessWidget { width: 5.w, ), Text( - "提现说明:收益到账后满 3 天方可申请提现,提现金额最低 50 元", + "提现说明:发起提现后1-7个工作日到账,提现最低金额50元", style: TextStyle( fontSize: 9.w, color: Colors.white diff --git a/lib/rtc/rtc_manager.dart b/lib/rtc/rtc_manager.dart index bdd54f9..a907550 100644 --- a/lib/rtc/rtc_manager.dart +++ b/lib/rtc/rtc_manager.dart @@ -370,91 +370,7 @@ class RTCManager { List vecDistance, int numFaces){ print("当前人脸数:$numFaces"); - if (numFaces > 0) { - // 只要不是0就取消计时 - _zeroTimer?.cancel(); - _zeroTimer = null; - } else { - // value == 0 - // 如果还没开始计时,则开始 - if (_zeroTimer == null && !isShow) { - _zeroTimer = Timer(const Duration(minutes: 2), () { - isShow = true; - // 隐藏 overlay - SmartDialog.dismiss(); - - // 获取 RoomController - final roomController = Get.isRegistered() - ? Get.find() - : Get.put(RoomController()); - - SmartDialog.show( - onDismiss: (){ - isShow = false; - roomController.setDialogDismiss(false); - }, - builder: (context) { - return ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(16.w)), - child: Material( - color: Colors.white, - child: Container( - width: 311.w, - height: 275.w, - padding: EdgeInsets.only( - top: 25.w, - right: 25.w, - left: 25.w - ), - child: Column( - children: [ - Image.asset( - Assets.imagesWarningIcon, - width: 102.w, - height: 102.w, - ), - SizedBox(height: 12.w,), - Text( - "系统检测到您2分钟内没有露脸,请露脸直播。多次违规后,取消当日前面直播时长,并且关闭直播间。", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 14.w - ), - ), - SizedBox(height: 7.w,), - Container( - width: 188.w, - height: 40.w, - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(12.w)), - color: const Color.fromRGBO(117, 98, 249, 1) - ), - child: Center( - child: Text( - "确认", - style: TextStyle( - fontSize: 14.w, - color: Colors.white - ), - ), - ), - ).onTap(() { - - // 隐藏 overlay - SmartDialog.dismiss(); - isShow = false; - roomController.setDialogDismiss(false); - }) - ], - ), - ), - ), - ); - }, - ); - }); - } - } + }, onError: (ErrorCodeType err, String msg) { print('RTC Engine 错误:$err,消息:$msg'); @@ -611,7 +527,7 @@ class RTCManager { ); print('正在加入频道:$channelId,UID:$uid,类型:$rtcType'); if (role == ClientRoleType.clientRoleBroadcaster) { - await _engine?.enableFaceDetection(true); + // await _engine?.enableFaceDetection(true); try{ await _engine?.enableContentInspect(