aslan-flutter/lib/chatvibe_ui/widgets/room/room_bottom_widget.dart
2026-07-01 18:25:58 +08:00

266 lines
9.3 KiB
Dart

import 'package:agora_rtc_engine/agora_rtc_engine.dart';
import 'package:aslan/chatvibe_ui/components/at_debounce_widget.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:aslan/chatvibe_ui/widgets/room/room_menu_dialog.dart';
import 'package:aslan/chatvibe_ui/widgets/room/room_msg_input.dart';
import 'package:provider/provider.dart';
import 'package:aslan/app_localizations.dart';
import 'package:aslan/chatvibe_ui/components/text/at_text.dart';
import 'package:aslan/chatvibe_core/constants/at_global_config.dart';
import 'package:aslan/chatvibe_core/utilities/at_lk_dialog_util.dart';
import 'package:aslan/chatvibe_core/utilities/at_room_utils.dart';
import 'package:aslan/chatvibe_data/sources/local/user_manager.dart';
import 'package:aslan/chatvibe_managers/rtc_manager.dart';
import 'package:aslan/chatvibe_managers/rtm_manager.dart';
import 'package:aslan/chatvibe_features/gift/gift_page.dart';
import 'package:aslan/chatvibe_ui/widgets/msg/bottom_message_conversation_list_page.dart';
import 'package:aslan/chatvibe_ui/widgets/room/emoji/room_emoji_page.dart';
import 'package:aslan/chatvibe_ui/widgets/room/game/room_game_list_page.dart';
class RoomBottomWidget extends StatefulWidget {
@override
_RoomBottomWidgetState createState() => _RoomBottomWidgetState();
}
class _RoomBottomWidgetState extends State<RoomBottomWidget> {
int roomMenuStime = 0;
@override
Widget build(BuildContext context) {
return Stack(
alignment: Alignment.center,
children: [
Container(
height: 55.w,
margin: EdgeInsetsDirectional.only(start: 15.w),
child: Row(
children: [
Container(
alignment: Alignment.center,
width: 95.w,
padding: EdgeInsets.symmetric(vertical: 4.w),
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(
"atu_images/room/at_icon_room_input.png",
),
),
),
child: Row(
children: [
SizedBox(width: 5.w),
Image.asset(
"atu_images/room/at_icon_room_input_t.png",
width: 22.w,
height: 22.w,
),
ATDebounceWidget(
child: text(
ATAppLocalizations.of(context)!.sayHi,
fontSize: 15.sp,
fontWeight: FontWeight.w600,
),
onTap: () {
if (ATRoomUtils.touristCanMsg(context)) {
Navigator.push(
context,
PopRoute(child: RoomMsgInput()),
);
}
},
),
],
),
),
SizedBox(width: 10.w),
ATDebounceWidget(
child: Image.asset(
"atu_images/room/at_icon_emoji.png",
width: 30.w,
height: 30.w,
),
onTap: () {
if (ATRoomUtils.touristCanMsg(context)) {
SmartDialog.show(
tag: "showRoomEmojiPage",
alignment: Alignment.bottomCenter,
debounce: true,
animationType: SmartAnimationType.fade,
maskColor: Colors.transparent,
clickMaskDismiss: true,
builder: (_) {
return RoomEmojiPage();
},
);
}
},
),
Spacer(),
Consumer<RtcProvider>(
builder: (context, ref, child) {
return _mic(ref);
},
),
SizedBox(width: 10.w),
GestureDetector(
child: Image.asset(
"atu_images/room/at_icon_botton_game.png",
width: 30.w,
height: 30.w,
fit: BoxFit.contain,
),
onTap: () {
showBottomInBottomDialog(context, RoomGameListPage());
},
),
SizedBox(width: 10.w),
GestureDetector(
child: Image.asset(
"atu_images/room/at_icon_botton_menu.png",
width: 30.w,
height: 30.w,
fit: BoxFit.contain,
),
onTap: () {
SmartDialog.show(
tag: "showRoomMenuDialog",
alignment: Alignment.bottomCenter,
debounce: true,
animationType: SmartAnimationType.fade,
maskColor: Colors.transparent,
clickMaskDismiss: true,
builder: (_) {
return RoomMenuDialog(roomMenuStime, (eTime) {
roomMenuStime = eTime;
});
},
);
},
),
SizedBox(width: 15.w),
],
),
),
PositionedDirectional(
bottom: 8.w,
child: ATDebounceWidget(
onTap: () {
SmartDialog.show(
tag: "showGiftControl",
alignment: Alignment.bottomCenter,
maskColor: Colors.transparent,
animationType: SmartAnimationType.fade,
clickMaskDismiss: true,
builder: (_) {
return GiftPage();
},
);
},
child: Image.asset(
"atu_images/room/at_icon_botton_gift.png",
width: 45.w,
height: 45.w,
fit: BoxFit.contain,
),
),
),
],
);
}
_mic(RtcProvider provider) {
///默认不显示
bool show = false;
///在麦上
provider.roomWheatMap.forEach((k, v) {
if (v.user?.id == AccountStorage().getCurrentUser()?.userProfile?.id) {
show = true;
}
});
return Visibility(
visible: show,
child: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
setState(() {
provider.isMic = !provider.isMic;
///没被禁麦才显示
provider.roomWheatMap.forEach((k, v) {
if (v.user?.id ==
AccountStorage().getCurrentUser()?.userProfile?.id &&
!provider.roomWheatMap[k]!.micMute!) {
if (!provider.isMic) {
Provider.of<RtcProvider>(
context,
listen: false,
).engine?.adjustRecordingSignalVolume(100);
Provider.of<RtcProvider>(
context,
listen: false,
).engine?.setClientRole(
role: ClientRoleType.clientRoleBroadcaster,
);
} else {
if (Provider.of<RtcProvider>(
context,
listen: false,
).isMusicPlaying) {
Provider.of<RtcProvider>(
context,
listen: false,
).engine?.adjustRecordingSignalVolume(0);
Provider.of<RtcProvider>(
context,
listen: false,
).engine?.setClientRole(
role: ClientRoleType.clientRoleBroadcaster,
);
Provider.of<RtcProvider>(
context,
listen: false,
).engine?.muteLocalAudioStream(false);
} else {
Provider.of<RtcProvider>(
context,
listen: false,
).engine?.setClientRole(
role: ClientRoleType.clientRoleAudience,
);
Provider.of<RtcProvider>(
context,
listen: false,
).engine?.muteLocalAudioStream(provider.isMic);
}
}
}
});
});
},
child: Padding(
padding: EdgeInsets.only(right: 12.w),
child: Container(
width: 30.w,
height: 30.w,
alignment: Alignment.center,
// decoration: BoxDecoration(
// color: Colors.white.withOpacity(0.2), shape: BoxShape.circle
// ),
child: Image.asset(
"atu_images/room/${provider.isMic ? 'at_icon_botton_mic_close' : 'at_icon_botton_mic_open'}.png",
width: 30.w,
fit: BoxFit.fill,
gaplessPlayback: true,
),
),
),
),
);
}
}