Browse Source

直播间的popup弹窗时,页面返回键的处理

master
ZHR007 2 months ago
parent
commit
a1b3d8df33
5 changed files with 178 additions and 132 deletions
  1. 9
      lib/controller/discover/room_controller.dart
  2. 284
      lib/pages/discover/live_room_page.dart
  3. 9
      lib/widget/live/live_room_anchor_showcase.dart
  4. 4
      lib/widget/live/live_room_notice_chat_panel.dart
  5. 4
      lib/widget/live/live_room_user_header.dart

9
lib/controller/discover/room_controller.dart

@ -59,6 +59,7 @@ class RoomController extends GetxController with WidgetsBindingObserver {
///
final RxInt roseCount = 0.obs;
var isDialogShowing = false.obs;
///
final LiveChatMessageService _messageService =
@ -94,6 +95,10 @@ class RoomController extends GetxController with WidgetsBindingObserver {
chatMessages.clear();
}
void setDialogDismiss(bool flag){
isDialogShowing.value = flag;
}
///
void _registerMessageListener() {
_messageService.registerMessageListener(
@ -460,8 +465,12 @@ class RoomController extends GetxController with WidgetsBindingObserver {
Get.log('❌ 送礼失败: ${response.data.data}');
// 使 addPostFrameCallback toast
WidgetsBinding.instance.addPostFrameCallback((_) {
setDialogDismiss(true);
SmartDialog.show(
alignment: Alignment.bottomCenter,
onDismiss: (){
setDialogDismiss(false);
},
maskColor: Colors.black.withOpacity(0.5),
builder: (_) => const LiveRechargePopup(),
);

284
lib/pages/discover/live_room_page.dart

@ -184,9 +184,14 @@ class _LiveRoomPageState extends State<LiveRoomPage> {
FocusScope.of(context).unfocus();
//
await _roomController.getVirtualAccount();
_roomController.setDialogDismiss(true);
SmartDialog.show(
backType: SmartBackType.block,
alignment: Alignment.bottomCenter,
maskColor: TDTheme.of(context).fontGyColor2,
onDismiss: () {
_roomController.setDialogDismiss(false);
},
builder: (_) => Obx(() {
// 使 API giftProducts使
final giftProducts = _roomController.giftProducts;
@ -205,9 +210,13 @@ class _LiveRoomPageState extends State<LiveRoomPage> {
void _showRechargePopup() {
//
FocusScope.of(context).unfocus();
_roomController.setDialogDismiss(true);
SmartDialog.show(
alignment: Alignment.bottomCenter,
maskColor: TDTheme.of(context).fontGyColor2,
onDismiss: (){
_roomController.setDialogDismiss(false);
},
builder: (_) => const LiveRechargePopup(),
);
}
@ -234,151 +243,164 @@ class _LiveRoomPageState extends State<LiveRoomPage> {
});
}
});
return Obx(() {
return PopScope(
canPop: !_roomController.isDialogShowing.value,
onPopInvokedWithResult: (bool didPop, Object? result) async {
// SmartDialog.dismiss();
// print('256>22>>' + didPop.toString());
// if (didPop) return;
return PopScope(
onPopInvokedWithResult: (bool didPop, Object? result) async {
SmartDialog.dismiss();
// 退RTM消息
if (Get.isRegistered<RoomController>()) {
final roomController = Get.find<RoomController>();
roomController.chatMessages.clear();
}
// pop Get.back()
if (!didPop) {
Get.back();
}
//
Future.delayed(const Duration(milliseconds: 200), () {
_overlayController.show();
});
},
child: Scaffold(
resizeToAvoidBottomInset: false,
body: Stack(
children: [
Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
Color.fromRGBO(248, 242, 255, 1),
Color.fromRGBO(247, 247, 247, 1),
],
//
if (_roomController.isDialogShowing.value) {
SmartDialog.dismiss();
return; //
}
// 退RTM消息
if (Get.isRegistered<RoomController>()) {
final roomController = Get.find<RoomController>();
roomController.chatMessages.clear();
}
// pop Get.back()
if (!didPop) {
Get.back();
}
//
Future.delayed(const Duration(milliseconds: 200), () {
_overlayController.show();
});
},
child: Scaffold(
resizeToAvoidBottomInset: false,
body: Stack(
children: [
Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
Color.fromRGBO(248, 242, 255, 1),
Color.fromRGBO(247, 247, 247, 1),
],
),
),
),
),
Container(
decoration: const BoxDecoration(
gradient: LinearGradient(
begin: Alignment.bottomCenter,
end: Alignment.topCenter,
colors: [
Color.fromRGBO(19, 16, 47, 1),
Color.fromRGBO(19, 16, 47, 1),
],
Container(
decoration: const BoxDecoration(
gradient: LinearGradient(
begin: Alignment.bottomCenter,
end: Alignment.topCenter,
colors: [
Color.fromRGBO(19, 16, 47, 1),
Color.fromRGBO(19, 16, 47, 1),
],
),
),
),
),
Container(
padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top),
child: Column(
children: [
SizedBox(height: 10.w),
Obx(() {
final detail = _roomController.rtcChannelDetail.value;
final anchorInfo = detail?.anchorInfo;
Container(
padding: EdgeInsets.only(
top: MediaQuery.of(context).padding.top,
),
child: Column(
children: [
SizedBox(height: 10.w),
Obx(() {
final detail = _roomController.rtcChannelDetail.value;
final anchorInfo = detail?.anchorInfo;
final userName = anchorInfo?.nickName ?? '用户';
final avatarAsset = anchorInfo?.profilePhoto ?? Assets.imagesUserAvatar;
const popularityText = '0'; // TODO: 使
final userName = anchorInfo?.nickName ?? '用户';
final avatarAsset =
anchorInfo?.profilePhoto ?? Assets.imagesUserAvatar;
const popularityText = '0'; // TODO: 使
return LiveRoomUserHeader(
userName: userName,
popularityText: popularityText,
avatarAsset: avatarAsset,
onCloseTap: () {
SmartDialog.dismiss();
// 退RTM消息
if (Get.isRegistered<RoomController>()) {
final roomController = Get.find<RoomController>();
roomController.chatMessages.clear();
}
Get.back();
//
Future.delayed(const Duration(milliseconds: 200), () {
_overlayController.show();
});
},
);
}),
SizedBox(height: 7.w),
LiveRoomAnchorShowcase(),
SizedBox(height: 5.w),
const LiveRoomActiveSpeaker(),
SizedBox(height: 9.w),
Expanded(child: const LiveRoomNoticeChatPanel()),
// / LiveRoomActionBar
if (MediaQuery.of(context).viewInsets.bottom == 0)
SafeArea(
top: false,
child: Padding(
padding: EdgeInsets.only(
bottom: 10.w,
left: 0,
right: 0,
),
child: LiveRoomActionBar(
messageController: _messageController,
onMessageChanged: (value) {
message = value;
},
onSendTap: _sendMessage,
onGiftTap: _showGiftPopup,
onChargeTap: _showRechargePopup,
onInputTap: _openInputDialog,
return LiveRoomUserHeader(
userName: userName,
popularityText: popularityText,
avatarAsset: avatarAsset,
onCloseTap: () {
SmartDialog.dismiss();
// 退RTM消息
if (Get.isRegistered<RoomController>()) {
final roomController = Get.find<RoomController>();
roomController.chatMessages.clear();
}
Get.back();
//
Future.delayed(const Duration(milliseconds: 200), () {
_overlayController.show();
});
},
);
}),
SizedBox(height: 7.w),
LiveRoomAnchorShowcase(),
SizedBox(height: 5.w),
const LiveRoomActiveSpeaker(),
SizedBox(height: 9.w),
Expanded(child: const LiveRoomNoticeChatPanel()),
// / LiveRoomActionBar
if (MediaQuery.of(context).viewInsets.bottom == 0)
SafeArea(
top: false,
child: Padding(
padding: EdgeInsets.only(
bottom: 10.w,
left: 0,
right: 0,
),
child: LiveRoomActionBar(
messageController: _messageController,
onMessageChanged: (value) {
message = value;
},
onSendTap: _sendMessage,
onGiftTap: _showGiftPopup,
onChargeTap: _showRechargePopup,
onInputTap: _openInputDialog,
),
),
),
),
],
),
),
// SVGA
const SvgaPlayerWidget(),
//
if (_showInputDialog) ...[
//
Positioned.fill(
child: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
//
FocusScope.of(context).unfocus();
//
_hideInputDialog();
},
child: Container(color: Colors.transparent),
],
),
),
//
AnimatedPositioned(
duration: const Duration(milliseconds: 200),
curve: Curves.easeOut,
left: 0,
right: 0,
bottom: MediaQuery.of(context).viewInsets.bottom,
child: _InputDialogWidget(
controller: _inputDialogController,
focusNode: _inputDialogFocusNode,
onSend: _sendInputDialogMessage,
onClose: _hideInputDialog,
// SVGA
const SvgaPlayerWidget(),
//
if (_showInputDialog) ...[
//
Positioned.fill(
child: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
//
FocusScope.of(context).unfocus();
//
_hideInputDialog();
},
child: Container(color: Colors.transparent),
),
),
),
//
AnimatedPositioned(
duration: const Duration(milliseconds: 200),
curve: Curves.easeOut,
left: 0,
right: 0,
bottom: MediaQuery.of(context).viewInsets.bottom,
child: _InputDialogWidget(
controller: _inputDialogController,
focusNode: _inputDialogFocusNode,
onSend: _sendInputDialogMessage,
onClose: _hideInputDialog,
),
),
],
],
],
),
),
),
);
);
});
}
}

9
lib/widget/live/live_room_anchor_showcase.dart

@ -376,9 +376,13 @@ class _LiveRoomAnchorShowcaseState extends State<LiveRoomAnchorShowcase> {
}
void _showGuestListDialog(BuildContext context, bool isMaleSeat) {
_roomController.setDialogDismiss(true);
SmartDialog.show(
alignment: Alignment.bottomCenter,
maskColor: Colors.black.withOpacity(0.5),
onDismiss: () {
_roomController.setDialogDismiss(false);
},
builder: (context) {
return LiveRoomGuestListDialog(
initialTab: isMaleSeat ? 1 : 0, // 0: , 1:
@ -406,10 +410,13 @@ class _LiveRoomAnchorShowcaseState extends State<LiveRoomAnchorShowcase> {
// ValueNotifier
final activeGift = ValueNotifier<int?>(null);
final giftNum = ValueNotifier<int>(1);
_roomController.setDialogDismiss(true);
SmartDialog.show(
alignment: Alignment.bottomCenter,
maskColor: Colors.black.withOpacity(0.5),
onDismiss: (){
_roomController.setDialogDismiss(false);
},
builder: (context) {
return Obx(() {
//

4
lib/widget/live/live_room_notice_chat_panel.dart

@ -180,9 +180,13 @@ class _LiveRoomNoticeChatPanelState extends State<LiveRoomNoticeChatPanel> {
final cardNum = linkMicCard?.num ?? 0;
// "上麦20玫瑰"20
if (cardNum == 0 && controller.roseCount.value < 20) {
controller.setDialogDismiss(true);
SmartDialog.show(
alignment: Alignment.bottomCenter,
maskColor: Colors.black.withOpacity(0.5),
onDismiss: (){
controller.setDialogDismiss(false);
},
builder: (_) => const LiveRechargePopup(),
);
return;

4
lib/widget/live/live_room_user_header.dart

@ -84,8 +84,12 @@ class LiveRoomUserHeader extends StatelessWidget {
if (isHost)
GestureDetector(
onTap: () {
roomController.setDialogDismiss(true);
SmartDialog.showAttach(
targetContext: context,
onDismiss: (){
roomController.setDialogDismiss(false);
},
builder: (context) {
//
final hasGuests =

Loading…
Cancel
Save