You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
4.6 KiB
126 lines
4.6 KiB
import 'package:cached_network_image/cached_network_image.dart';
|
|
import 'package:dating_touchme_app/controller/discover/room_controller.dart';
|
|
import 'package:dating_touchme_app/controller/global.dart';
|
|
import 'package:dating_touchme_app/generated/assets.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
import 'package:get/get.dart';
|
|
|
|
class LiveRoomActiveSpeaker extends StatelessWidget {
|
|
const LiveRoomActiveSpeaker({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
// 获取 RoomController(在 Obx 外部获取,避免重复查找)
|
|
final roomController = Get.isRegistered<RoomController>()
|
|
? Get.find<RoomController>()
|
|
: null;
|
|
|
|
if (roomController == null) {
|
|
return const SizedBox.shrink();
|
|
}
|
|
|
|
// 获取当前用户信息
|
|
final currentUserId = GlobalData().userId ?? GlobalData().userData?.id;
|
|
final currentUserPhoto = GlobalData().userData?.profilePhoto ?? '';
|
|
|
|
return Obx(() {
|
|
// 访问响应式变量以触发更新
|
|
final rtcChannelDetail = roomController.rtcChannelDetail.value;
|
|
final isLive = roomController.isLive.value;
|
|
|
|
// 判断当前用户是否上麦
|
|
bool isOnSeat = false;
|
|
if (currentUserId != null) {
|
|
// 方式1:检查当前用户是否在 maleInfo 或 femaleInfo 中(maleAudience/femaleAudience 角色)
|
|
if (rtcChannelDetail != null) {
|
|
final maleInfo = rtcChannelDetail.maleInfo;
|
|
final femaleInfo = rtcChannelDetail.femaleInfo;
|
|
|
|
isOnSeat =
|
|
(maleInfo != null &&
|
|
(maleInfo.userId == currentUserId ||
|
|
maleInfo.miId == currentUserId)) ||
|
|
(femaleInfo != null &&
|
|
(femaleInfo.userId == currentUserId ||
|
|
femaleInfo.miId == currentUserId));
|
|
}
|
|
|
|
// 方式2:如果 isLive 为 true,说明用户已连接(可能是 audience 角色)
|
|
// 如果已经在 maleInfo/femaleInfo 中,就不需要再检查 isLive
|
|
if (!isOnSeat && isLive) {
|
|
isOnSeat = true;
|
|
}
|
|
}
|
|
|
|
// 确定显示的图标
|
|
final micIcon = isOnSeat ? Assets.imagesMicOpen : Assets.imagesMicClose;
|
|
|
|
return Row(
|
|
mainAxisAlignment: MainAxisAlignment.start,
|
|
children: [
|
|
Stack(
|
|
clipBehavior: Clip.none,
|
|
children: [
|
|
Container(
|
|
width: 34.w,
|
|
height: 34.w,
|
|
margin: EdgeInsets.only(left: 13.w),
|
|
child: ClipRRect(
|
|
borderRadius: BorderRadius.all(Radius.circular(34.w)),
|
|
child: currentUserPhoto.isNotEmpty
|
|
? CachedNetworkImage(
|
|
imageUrl: currentUserPhoto,
|
|
width: 34.w,
|
|
height: 34.w,
|
|
fit: BoxFit.cover,
|
|
placeholder: (context, url) => Container(
|
|
width: 34.w,
|
|
height: 34.w,
|
|
color: Colors.grey[300],
|
|
child: Center(
|
|
child: SizedBox(
|
|
width: 16.w,
|
|
height: 16.w,
|
|
child: CircularProgressIndicator(
|
|
strokeWidth: 2,
|
|
color: Colors.grey[600],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
errorWidget: (context, url, error) => Image.asset(
|
|
Assets.imagesUserAvatar,
|
|
width: 34.w,
|
|
height: 34.w,
|
|
),
|
|
)
|
|
: Image.asset(
|
|
Assets.imagesUserAvatar,
|
|
width: 34.w,
|
|
height: 34.w,
|
|
),
|
|
),
|
|
),
|
|
Positioned(
|
|
bottom: -3.w,
|
|
left: 20.w,
|
|
child: Container(
|
|
width: 20.w,
|
|
height: 20.w,
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.all(Radius.circular(4.w)),
|
|
color: const Color.fromRGBO(0, 0, 0, .65),
|
|
),
|
|
child: Center(
|
|
child: Image.asset(micIcon, width: 10.w, height: 11.w),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
],
|
|
);
|
|
});
|
|
}
|
|
}
|