import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:aslan/app_localizations.dart'; import 'package:aslan/chatvibe_core/constants/at_global_config.dart'; import 'package:aslan/chatvibe_ui/components/at_compontent.dart'; import 'package:aslan/chatvibe_features/room/chat/all/all_chat_page.dart'; import 'package:aslan/chatvibe_features/room/chat/chat/chat_page.dart'; import 'package:aslan/chatvibe_features/room/chat/gift/gift_chat_page.dart'; import 'package:aslan/chatvibe_managers/rtc_manager.dart'; import 'package:aslan/chatvibe_ui/widgets/room/room_bottom_widget.dart'; import 'package:provider/provider.dart'; import 'package:aslan/chatvibe_ui/components/at_float_ichart.dart'; import 'package:aslan/chatvibe_core/at_lk_event_bus.dart'; import 'package:aslan/chatvibe_core/routes/at_fluro_navigator.dart'; import 'package:aslan/chatvibe_domain/models/res/join_room_res.dart'; import 'package:aslan/chatvibe_managers/gift_animation_manager.dart'; import 'package:aslan/chatvibe_managers/gift_system_manager.dart'; import 'package:aslan/chatvibe_managers/rtm_manager.dart'; import 'package:aslan/chatvibe_ui/widgets/room/anim/l_gift_animal_view.dart'; import 'package:aslan/chatvibe_ui/widgets/room/anim/room_entrance_screen.dart'; import 'package:aslan/chatvibe_ui/widgets/room/effect/luck_gift_nomor_anim_widget.dart'; import 'package:aslan/chatvibe_ui/widgets/room/effect/vapp_svga_layer_widget.dart'; import 'package:aslan/chatvibe_ui/widgets/room/give_room_luck_with_other_page.dart'; import 'package:aslan/chatvibe_ui/widgets/room/lucky_gift_tag_widget.dart'; import 'package:aslan/chatvibe_ui/widgets/room/room_head_widget.dart'; import 'package:aslan/chatvibe_ui/widgets/room/room_msg_item.dart'; import 'package:aslan/chatvibe_ui/widgets/room/room_online_user_widget.dart'; import 'package:aslan/chatvibe_ui/widgets/room/room_play_widget.dart'; import 'package:aslan/chatvibe_ui/widgets/room/seat/room_seat_widget.dart'; ///语聊房 class ATVoiceChatRoomPage extends StatefulWidget { const ATVoiceChatRoomPage({super.key}); @override _VoiceRoomPageState createState() => _VoiceRoomPageState(); } class _VoiceRoomPageState extends State with SingleTickerProviderStateMixin { late TabController _tabController; final List _pages = [AllChatPage(), ChatPage(), GiftChatPage()]; final List _tabs = []; late StreamSubscription _subscription; @override void initState() { super.initState(); _tabController = TabController(length: _pages.length, vsync: this); Provider.of(context, listen: false).msgFloatingGiftListener = _floatingGiftListener; _tabController.addListener(() {}); // 监听切换 _subscription = eventBus.on().listen((event) { if (mounted) { Provider.of(context, listen: false).reset(); Provider.of( context, listen: false, ).updateHideLGiftAnimal(false); } }); } @override void dispose() { _tabController.dispose(); // 释放资源 _subscription.cancel(); super.dispose(); } bool roomThemeBackActi(JoinRoomRes? room) { if (room?.roomProps?.roomTheme != null) { if (room?.roomProps?.roomTheme?.themeBack != null && room!.roomProps!.roomTheme!.themeBack!.isNotEmpty) { if ((room.roomProps?.roomTheme?.expireTime ?? 0) > DateTime.now().millisecondsSinceEpoch) { return true; } } } return false; } @override Widget build(BuildContext context) { _tabs.clear(); _tabs.add(Tab(text: ATAppLocalizations.of(context)!.all)); _tabs.add(Tab(text: ATAppLocalizations.of(context)!.chat)); _tabs.add(Tab(text: ATAppLocalizations.of(context)!.gift)); return PopScope( canPop: false, onPopInvokedWithResult: (bool didPop, Object? result) { if (!didPop) { ATFloatIchart().show(); ATNavigatorUtils.goBack(context); } }, child: Scaffold( backgroundColor: ATGlobalConfig.businessLogicStrategy.getVoiceRoomBackgroundColor(), resizeToAvoidBottomInset: false, body: SafeArea( top: false, child: Stack( children: [ Consumer( builder: (context, ref, child) { return roomThemeBackActi(ref.currenRoom) ? netImage( url: ref.currenRoom?.roomProps?.roomTheme?.themeBack ?? "", width: ScreenUtil().screenWidth, height: ScreenUtil().screenHeight, noDefaultImg: true, fit: BoxFit.cover, ) : Image.asset( ATGlobalConfig.businessLogicStrategy .getVoiceRoomDefaultBackgroundImage(), width: ScreenUtil().screenWidth, height: ScreenUtil().screenHeight, fit: BoxFit.cover, ); }, ), Column( children: [ SizedBox(height: ScreenUtil().setWidth(42)), RoomHeadWidget(), SizedBox(height: ScreenUtil().setWidth(5)), RoomSeatWidget(), SizedBox(height: 2.w,), RoomOnlineUserWidget(), Expanded( child: Stack( children: [ Column( children: [_buildChatView(), RoomBottomWidget()], ), LGiftAnimalPage(), Consumer( builder: (context, ref, child) { return (ref.playingLudoGame != null && !ref.isMinLudoGame) ? Container() : LuckyGiftTagWidget(); }, ), Transform.translate( offset: Offset(0, -20), child: RoomAnimationQueueScreen(), ), ], ), ), ], ), Consumer( builder: (context, ref, child) { return ref.hideLGiftAnimal || ref.hideLGiftAnimalOnRoomMessagePage || ref.hideLGiftAnimalOnRoomH5Page ? Container() : GiveRoomLuckWithOtherWidget(); }, ), // _buildPlayViews(), VapPlusSvgaPlayer(tag: "room_gift"), ///幸运礼物中奖动画 LuckGiftNomorAnimWidget(), ], ), ), ), ); } ///消息 Widget _buildChatView() { return Expanded( child: Stack( alignment: AlignmentDirectional.bottomEnd, children: [ Column( children: [ TabBar( tabAlignment: TabAlignment.start, labelPadding: ATGlobalConfig.businessLogicStrategy .getVoiceRoomTabLabelPadding() .copyWith( left: ATGlobalConfig.businessLogicStrategy .getVoiceRoomTabLabelPadding() .left * ScreenUtil().setWidth(1), right: ATGlobalConfig.businessLogicStrategy .getVoiceRoomTabLabelPadding() .right * ScreenUtil().setWidth(1), ), labelColor: ATGlobalConfig.businessLogicStrategy .getVoiceRoomTabLabelColor(), isScrollable: true, indicator: BoxDecoration(), unselectedLabelColor: ATGlobalConfig.businessLogicStrategy .getVoiceRoomTabUnselectedLabelColor(), labelStyle: ATGlobalConfig.businessLogicStrategy .getVoiceRoomTabLabelStyle() .copyWith( fontSize: ATGlobalConfig.businessLogicStrategy .getVoiceRoomTabLabelStyle() .fontSize! * ScreenUtil().setSp(1), ), unselectedLabelStyle: ATGlobalConfig.businessLogicStrategy .getVoiceRoomTabUnselectedLabelStyle() .copyWith( fontSize: ATGlobalConfig.businessLogicStrategy .getVoiceRoomTabUnselectedLabelStyle() .fontSize! * ScreenUtil().setSp(1), ), indicatorColor: ATGlobalConfig.businessLogicStrategy .getVoiceRoomTabIndicatorColor(), dividerColor: ATGlobalConfig.businessLogicStrategy .getVoiceRoomTabDividerColor(), controller: _tabController, tabs: _tabs, ), Expanded( child: Container( margin: ATGlobalConfig.businessLogicStrategy .getVoiceRoomChatContainerMargin() .copyWith( end: ATGlobalConfig.businessLogicStrategy .getVoiceRoomChatContainerMargin() .end * ScreenUtil().setWidth(1), ), child: MediaQuery.removePadding( context: context, removeTop: true, child: TabBarView( controller: _tabController, children: _pages, ), ), ), ), ], ), RoomPlayWidget(), ], ), ); } ///礼物上飘动画 _floatingGiftListener(Msg msg) { if (Provider.of(context, listen: false).hideLGiftAnimal) { return; } var giftModel = LGiftModel(); giftModel.labelId = "${msg.gift?.id}${msg.user?.id}${msg.toUser?.id}"; giftModel.sendUserName = msg.user?.userNickname ?? ""; giftModel.sendToUserName = msg.toUser?.userNickname ?? ""; giftModel.sendUserPic = msg.user?.userAvatar ?? ""; giftModel.giftPic = msg.gift?.giftPhoto ?? ""; giftModel.giftCount = msg.number ?? 0; giftModel.viptype = msg.user?.getVIP()?.name ?? ""; Provider.of( context, listen: false, ).addGift(giftModel); } }