Browse Source

feat(live): 添加直播间设置功能与退出房间逻辑

- 新增直播设置按钮,仅主持人可见
- 实现解除连麦与结束直播功能
- 添加相关资源图片引用
- 优化页面返回与 overlay 控制逻辑
- 修复用户头像显示样式问题
- 调整顶部用户信息布局结构
ios
Jolie 3 months ago
parent
commit
77d32e2f48
5 changed files with 154 additions and 36 deletions
  1. BIN
      assets/images/exit_room.png
  2. BIN
      assets/images/mic_off.png
  3. 2
      lib/generated/assets.dart
  4. 2
      lib/pages/discover/live_room_page.dart
  5. 186
      lib/widget/live/live_room_user_header.dart

BIN
assets/images/exit_room.png

Before After
Width: 29  |  Height: 31  |  Size: 702 B

BIN
assets/images/mic_off.png

Before After
Width: 33  |  Height: 37  |  Size: 642 B

2
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';

2
lib/pages/discover/live_room_page.dart

@ -107,7 +107,7 @@ class _LiveRoomPageState extends State<LiveRoomPage> {
Widget build(BuildContext context) {
return PopScope(
onPopInvokedWithResult: (bool didPop, Object? result) async {
_overlayController.toggle();
_overlayController.hide();
Get.back();
},
child: Scaffold(

186
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<RoomController>();
final overlayController = Get.find<OverlayController>();
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),
),
),
),
),
],
),
],
);
}
}
Loading…
Cancel
Save