diff --git a/assets/images/exit_room.png b/assets/images/exit_room.png new file mode 100644 index 0000000..4f817f9 Binary files /dev/null and b/assets/images/exit_room.png differ diff --git a/assets/images/mic_off.png b/assets/images/mic_off.png new file mode 100644 index 0000000..351a411 Binary files /dev/null and b/assets/images/mic_off.png differ diff --git a/lib/generated/assets.dart b/lib/generated/assets.dart index f505ebe..b9f8919 100644 --- a/lib/generated/assets.dart +++ b/lib/generated/assets.dart @@ -102,6 +102,7 @@ class Assets { static const String imagesEmoji = 'assets/images/emoji.png'; static const String imagesEmojiTab = 'assets/images/emoji_tab.png'; static const String imagesEmptyIcon = 'assets/images/empty_icon.png'; + static const String imagesExitRoom = 'assets/images/exit_room.png'; static const String imagesFemale = 'assets/images/female.png'; static const String imagesFemaleEmpty = 'assets/images/female_empty.png'; static const String imagesFireIcon = 'assets/images/fire_icon.png'; @@ -137,6 +138,7 @@ class Assets { static const String imagesMessagePre = 'assets/images/message_pre.png'; static const String imagesMicClose = 'assets/images/mic_close.png'; static const String imagesMicLine = 'assets/images/mic_line.png'; + static const String imagesMicOff = 'assets/images/mic_off.png'; static const String imagesMicOpen = 'assets/images/mic_open.png'; static const String imagesMineNol = 'assets/images/mine_nol.png'; static const String imagesMinePre = 'assets/images/mine_pre.png'; diff --git a/lib/pages/discover/live_room_page.dart b/lib/pages/discover/live_room_page.dart index 9c4cc4c..36d5b00 100644 --- a/lib/pages/discover/live_room_page.dart +++ b/lib/pages/discover/live_room_page.dart @@ -107,7 +107,7 @@ class _LiveRoomPageState extends State { Widget build(BuildContext context) { return PopScope( onPopInvokedWithResult: (bool didPop, Object? result) async { - _overlayController.toggle(); + _overlayController.hide(); Get.back(); }, child: Scaffold( diff --git a/lib/widget/live/live_room_user_header.dart b/lib/widget/live/live_room_user_header.dart index baae02c..99d2947 100644 --- a/lib/widget/live/live_room_user_header.dart +++ b/lib/widget/live/live_room_user_header.dart @@ -1,6 +1,11 @@ +import 'package:dating_touchme_app/controller/discover/room_controller.dart'; +import 'package:dating_touchme_app/controller/overlay_controller.dart'; import 'package:dating_touchme_app/generated/assets.dart'; +import 'package:dating_touchme_app/widget/live/disconnect_mic_dialog.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:get/get.dart'; /// 直播间顶部用户信息与操作区域 class LiveRoomUserHeader extends StatelessWidget { @@ -25,6 +30,11 @@ class LiveRoomUserHeader extends StatelessWidget { @override Widget build(BuildContext context) { + // 获取 RoomController 判断当前用户角色 + final roomController = Get.find(); + final overlayController = Get.find(); + final isHost = roomController.currentRole == CurrentRole.broadcaster; + return Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -40,20 +50,20 @@ class LiveRoomUserHeader extends StatelessWidget { children: [ // 支持网络图片和本地资源 ClipOval( - child: Image.network( - avatarAsset, - width: 34.w, - height: 34.w, - fit: BoxFit.cover, - errorBuilder: (context, error, stackTrace) { - return Image.asset( - Assets.imagesUserAvatar, - width: 34.w, - height: 34.w, - ); - }, - ), - ), + child: Image.network( + avatarAsset, + width: 34.w, + height: 34.w, + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) { + return Image.asset( + Assets.imagesUserAvatar, + width: 34.w, + height: 34.w, + ); + }, + ), + ), SizedBox(width: 7.w), Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -61,37 +71,143 @@ class LiveRoomUserHeader extends StatelessWidget { children: [ Text( userName, - style: TextStyle( - fontSize: 13.w, - color: Colors.white, - ), + style: TextStyle(fontSize: 13.w, color: Colors.white), ), ], ), ], ), ), - GestureDetector( - onTap: onCloseTap, - child: Container( - width: 30.w, - height: 30.w, - margin: EdgeInsets.only(right: 15.w), - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(30.w)), - color: const Color.fromRGBO(0, 0, 0, .3), - ), - child: Center( - child: Image.asset( - closeIconAsset, - width: 14.w, - height: 14.w, + Row( + children: [ + // 只有主持人才显示直播设置按钮 + if (isHost) + GestureDetector( + onTap: () { + SmartDialog.showAttach( + targetContext: context, + builder: (context) { + return Container( + width: 100.w, + margin: EdgeInsets.only(left: 160.w), + decoration: BoxDecoration( + color: Colors.black.withAlpha(80), + borderRadius: BorderRadius.all(Radius.circular(10.w)), + ), + child: Column( + children: [ + SizedBox(height: 15.w), + GestureDetector( + onTap: () { + // 关闭设置弹窗 + SmartDialog.dismiss(); + // 弹出解除连麦对话框 + SmartDialog.show(builder: (context){ + return DisconnectMicDialog(); + }); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset(Assets.imagesMicOff, width: 15.w), + SizedBox(width: 5.w), + Text( + '解除连麦', + style: TextStyle( + color: Colors.white, + fontSize: 13.sp, + ), + ), + ], + ), + ), + SizedBox(height: 15.w), + GestureDetector( + onTap: () async { + // 关闭弹窗 + SmartDialog.dismiss(); + // 隐藏 overlay + overlayController.hide(); + // 返回上一页 + Get.back(); + // 调用结束直播方法 + await roomController.leaveChannel(); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + Assets.imagesExitRoom, + width: 15.w, + ), + SizedBox(width: 5.w), + Text( + '结束直播', + style: TextStyle( + color: Colors.white, + fontSize: 13.sp, + ), + ), + ], + ), + ), + SizedBox(height: 15.w), + ], + ), + ); + }, + ); + }, + child: Container( + height: 30.w, + padding: EdgeInsets.symmetric(horizontal: 5.w), + margin: EdgeInsets.only(right: 15.w), + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(30.w)), + color: const Color.fromRGBO(0, 0, 0, .3), + border: Border.all( + color: const Color.fromRGBO(255, 255, 255, .3), + width: 1.w, + ), + ), + child: Row( + children: [ + Icon( + Icons.settings_rounded, + color: Colors.white, + size: 18.w, + ), + Text( + '直播设置', + style: TextStyle(color: Colors.white, fontSize: 13.sp), + ), + Icon( + Icons.keyboard_arrow_down_sharp, + color: Colors.white, + size: 18.w, + ), + ], + ), + ), + ), + GestureDetector( + onTap: onCloseTap, + child: Container( + width: 30.w, + height: 30.w, + margin: EdgeInsets.only(right: 15.w), + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(30.w)), + color: const Color.fromRGBO(0, 0, 0, .3), + ), + child: Center( + child: Image.asset(closeIconAsset, width: 14.w, height: 14.w), + ), ), ), - ), + ], ), ], ); } } -