chatapp3-flutter/lib/shared/tools/sc_lk_dialog_util.dart
2026-04-09 21:32:23 +08:00

636 lines
19 KiB
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:yumi/shared/tools/sc_room_utils.dart';
import 'package:provider/provider.dart';
import 'package:yumi/app_localizations.dart';
import 'package:yumi/services/audio/rtc_manager.dart';
import 'package:yumi/ui_kit/widgets/sc_lk_tap_widget.dart';
import 'package:yumi/ui_kit/components/dialog/dialog_base.dart';
import 'package:yumi/ui_kit/theme/socialchat_theme.dart';
import 'package:yumi/app/constants/sc_screen.dart';
void showEnterRoomConfirm(
String roomId,
BuildContext context, {
bool needOpenRedenvelope = false,
bool fromFloting = false,
String redPackId = "",
}) {
if (roomId.isNotEmpty) {
SmartDialog.dismiss(tag: "showConfirmDialog");
SmartDialog.show(
tag: "showConfirmDialog",
alignment: Alignment.center,
animationType: SmartAnimationType.fade,
builder: (_) {
return MsgDialog(
title:
fromFloting
? SCAppLocalizations.of(context)!.enterThisVoiceChatRoom
: SCAppLocalizations.of(context)!.tips,
msg:
fromFloting
? SCAppLocalizations.of(
context,
)!.swipeLeftOnTheFloatingScreenAreaToQuicklyCloseIt
: SCAppLocalizations.of(context)!.enterRoomConfirmTips,
btnText: SCAppLocalizations.of(context)!.confirm,
onEnsure: () {
Provider.of<RealTimeCommunicationManager>(context, listen: false).joinVoiceRoomSession(
context,
roomId,
needOpenRedenvelope: needOpenRedenvelope,
redPackId: redPackId,
);
},
);
},
);
}
}
///中间对话框 半透明
Future showCenterDialog(
BuildContext context,
Widget child, {
Color? barrierColor,
}) {
return showGeneralDialog(
context: context,
barrierLabel: '',
barrierDismissible: true,
transitionDuration: Duration(milliseconds: 350),
barrierColor: barrierColor ?? Colors.black.withOpacity(0.2),
pageBuilder: (
BuildContext context,
Animation animation,
Animation secondaryAnimation,
) {
return Center(child: child);
},
);
}
///中间对话框 半透明
showCenterAnimationDialog(BuildContext context, Widget child) {
showGeneralDialog(
context: context,
barrierLabel: '',
barrierDismissible: true,
transitionDuration: Duration(milliseconds: 800),
barrierColor: Colors.black.withOpacity(0.2),
pageBuilder: (
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
) {
print(
'showCenterAnimationDialog:${animation.value},${secondaryAnimation.value}',
);
CurvedAnimation curvedAnimation = CurvedAnimation(
curve: Curves.bounceOut,
reverseCurve: Curves.easeInExpo,
parent: animation,
);
return Center(
child: ScaleTransition(
scale: Tween(begin: 0.0, end: 1.0).animate(curvedAnimation),
child: SlideTransition(
position: Tween(
begin: Offset(0.0, 0.0),
end: Offset(0.0, 3.0),
).animate(secondaryAnimation),
child: FadeTransition(
opacity: Tween(begin: 0.0, end: 1.0).animate(curvedAnimation),
child: child,
),
),
),
);
},
);
}
///中间对话框 半透明(重下面弹出)
showBottomInCenterDialog(BuildContext context, Widget child) {
showGeneralDialog(
context: context,
barrierLabel: '',
barrierDismissible: true,
transitionDuration: Duration(milliseconds: 350),
barrierColor: Colors.black.withOpacity(0.6),
pageBuilder: (
BuildContext context,
Animation<double> animation,
Animation secondaryAnimation,
) {
return SlideTransition(
position: Tween(
begin: Offset(0.0, 2.0),
end: Offset(0.0, 0.0),
).chain(CurveTween(curve: Curves.ease)).animate(animation),
child: Center(child: child),
);
},
);
}
///中间对话框 半透明 点外部不消失
showCenterDialog2(BuildContext context, Widget child, {Color? mask}) {
showGeneralDialog(
context: context,
barrierLabel: '',
barrierDismissible: false,
transitionDuration: Duration(milliseconds: 350),
barrierColor: mask ?? Colors.black.withOpacity(0.6),
pageBuilder: (
BuildContext context,
Animation animation,
Animation secondaryAnimation,
) {
return Center(child: child);
},
);
}
///底部对话框 透明
showBottomDialog(
BuildContext context,
Widget child, {
Color? barrierColor,
Duration? transitionDuration,
}) {
showGeneralDialog(
context: context,
barrierLabel: '',
barrierDismissible: true,
barrierColor: barrierColor ?? Colors.transparent,
transitionDuration: transitionDuration ?? Duration(milliseconds: 350),
pageBuilder: (
BuildContext context,
Animation animation,
Animation secondaryAnimation,
) {
return Column(
children: <Widget>[Expanded(child: SizedBox(width: width(1))), child],
);
},
);
}
///底部对话框 透明(从下面弹出)
showBottomInBottomDialog(
BuildContext context,
Widget child, {
Color? barrierColor,
bool barrierDismissible = true,
}) {
showGeneralDialog(
context: context,
barrierLabel: '',
barrierDismissible: barrierDismissible,
transitionDuration: Duration(milliseconds: 325),
barrierColor: barrierColor ?? Colors.black.withOpacity(0.3),
pageBuilder: (
BuildContext context,
Animation<double> animation,
Animation secondaryAnimation,
) {
return Column(
children: <Widget>[
Expanded(child: SizedBox(width: width(1))),
SlideTransition(
position: Tween(
begin: Offset(0.0, 2.0),
end: Offset(0.0, 0.0),
).chain(CurveTween(curve: Curves.ease)).animate(animation),
child: child,
),
],
);
},
);
}
///底部对话框 半透明
showBottomDialog2(BuildContext context, Widget child) {
showGeneralDialog(
context: context,
barrierLabel: '',
barrierDismissible: true,
transitionDuration: Duration(milliseconds: 350),
barrierColor: Colors.black.withOpacity(0.2),
pageBuilder: (
BuildContext context,
Animation animation,
Animation secondaryAnimation,
) {
return Column(
children: <Widget>[Expanded(child: SizedBox(width: width(1))), child],
);
},
);
}
///显示菜单
showMenuPop(BuildContext context, Widget child) {
showGeneralDialog(
context: context,
barrierLabel: '',
barrierDismissible: true,
transitionDuration: Duration(milliseconds: 350),
pageBuilder: (
BuildContext context,
Animation animation,
Animation secondaryAnimation,
) {
return Row(
children: <Widget>[
Spacer(),
Column(
children: <Widget>[SizedBox(height: height(55)), child, Spacer()],
),
SizedBox(width: width(15)),
],
);
},
);
}
class SCForceDialog extends StatelessWidget {
final String msg;
final Function onClick;
const SCForceDialog({Key? key, required this.msg, required this.onClick})
: super(key: key);
@override
Widget build(BuildContext context) {
return Container(
width: width(269),
decoration: ShapeDecoration(
color: Color(0xffffffff),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(width(10))),
),
),
child: _bdg(context),
);
}
Widget _bdg(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(
padding: EdgeInsets.symmetric(
horizontal: width(30),
vertical: height(15),
),
alignment: Alignment.center,
child: Text(
msg,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: sp(16),
color: Color(0xff333333),
fontWeight: FontWeight.w500,
decoration: TextDecoration.none,
),
),
),
Divider(height: height(1), color: SocialChatTheme.dividerColor),
Container(
height: height(46),
alignment: Alignment.center,
child: Row(
children: <Widget>[
Expanded(
child: GestureDetector(
behavior: HitTestBehavior.opaque,
child: Text(
"确定",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: sp(16),
color: Color(0xfFFFF4FBB),
fontWeight: FontWeight.w400,
decoration: TextDecoration.none,
),
),
onTap: () {
Navigator.of(context).pop();
if (onClick != null) {
onClick();
}
},
),
),
],
),
),
],
);
}
}
///提示对话框
class SCTsDialog extends StatelessWidget {
final String msg;
final Function onClick;
const SCTsDialog({Key? key, required this.msg, required this.onClick})
: super(key: key);
@override
Widget build(BuildContext context) {
return Container(
width: width(269),
decoration: ShapeDecoration(
color: Color(0xffffffff),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(width(10))),
),
),
child: _bdg(context),
);
}
Widget _bdg(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(
padding: EdgeInsets.symmetric(
horizontal: width(30),
vertical: height(25),
),
alignment: Alignment.center,
child: Text(
msg,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: sp(16),
color: Color(0xff333333),
fontWeight: FontWeight.w500,
decoration: TextDecoration.none,
),
),
),
Divider(height: height(1), color: SocialChatTheme.dividerColor),
Container(
height: height(46),
alignment: Alignment.center,
child: Row(
children: <Widget>[
Expanded(
child: GestureDetector(
behavior: HitTestBehavior.opaque,
child: Text(
"取消",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: sp(16),
color: Color(0xFFAAAAAA),
fontWeight: FontWeight.w400,
decoration: TextDecoration.none,
),
),
onTap: () {
Navigator.of(context).pop();
},
),
),
VerticalDivider(width: width(1), color: SocialChatTheme.dividerColor),
Expanded(
child: GestureDetector(
behavior: HitTestBehavior.opaque,
child: Text(
"确定",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: sp(16),
color: SocialChatTheme.primaryColor,
fontWeight: FontWeight.w400,
decoration: TextDecoration.none,
),
),
onTap: () {
Navigator.of(context).pop();
if (onClick != null) {
onClick();
}
},
),
),
],
),
),
],
);
}
}
///提示对话框
class SCTsDialog2 extends StatelessWidget {
final String msg;
final String btmText;
final Function onClick;
const SCTsDialog2({
Key? key,
required this.msg,
required this.onClick,
required this.btmText,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
width: width(269),
decoration: ShapeDecoration(
color: Color(0xffffffff),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(width(10))),
),
),
child: _bdg(context),
);
}
Widget _bdg(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(
padding: EdgeInsets.symmetric(
horizontal: width(30),
vertical: height(15),
),
alignment: Alignment.center,
child: Text(
msg,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: sp(16),
color: Color(0xff333333),
fontWeight: FontWeight.w500,
decoration: TextDecoration.none,
),
),
),
Divider(color: Color(0xffF3F3F3), endIndent: 15.w, indent: 15.w),
Container(
height: height(46),
alignment: Alignment.center,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
SizedBox(width: 15.w),
Expanded(
child: SCLkTapWidget(
borderRadius: BorderRadius.circular(52),
child: Container(
width: 100.w,
height: 35.w,
alignment: Alignment.center,
decoration: BoxDecoration(
color: Color(0xffF3F3F3),
borderRadius: BorderRadius.circular(52),
),
child: Text(
"在考虑下",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: sp(16),
color: Color(0xFF333333),
fontWeight: FontWeight.w400,
decoration: TextDecoration.none,
),
),
),
onTap: () {
Navigator.of(context).pop();
},
),
),
SizedBox(width: 35.w),
Expanded(
child: SCLkTapWidget(
borderRadius: BorderRadius.circular(52),
child: Container(
width: 100.w,
height: 35.w,
alignment: Alignment.center,
decoration: BoxDecoration(
color: Color(0xffBA0CF9),
borderRadius: BorderRadius.circular(52),
),
child: Text(
"$btmText",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: sp(16),
color: Colors.white,
fontWeight: FontWeight.w400,
decoration: TextDecoration.none,
),
),
),
onTap: () {
Navigator.of(context).pop();
if (onClick != null) {
onClick();
}
},
),
),
SizedBox(width: 15.w),
],
),
),
],
);
}
}
// 提示框
class SCPromptDialog extends StatelessWidget {
final String msg;
final Function onClick;
const SCPromptDialog({Key? key, required this.msg, required this.onClick})
: super(key: key);
@override
Widget build(BuildContext context) {
return Container(
width: width(269),
decoration: ShapeDecoration(
color: Color(0xffffffff),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(width(10))),
),
),
child: _bdg(context),
);
}
Widget _bdg(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(
padding: EdgeInsets.symmetric(
horizontal: width(30),
vertical: height(15),
),
alignment: Alignment.center,
child: Text(
msg,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: sp(16),
color: Color(0xff333333),
fontWeight: FontWeight.w500,
decoration: TextDecoration.none,
),
),
),
Divider(height: height(1), color: SocialChatTheme.dividerColor),
Container(
height: height(46),
alignment: Alignment.center,
child: Row(
children: <Widget>[
Expanded(
child: GestureDetector(
behavior: HitTestBehavior.opaque,
child: Text(
"我知道了",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: sp(16),
color: Color(0xffFFE400),
fontWeight: FontWeight.w400,
decoration: TextDecoration.none,
),
),
onTap: () {
Navigator.of(context).pop();
if (onClick != null) {
onClick();
}
},
),
),
],
),
),
],
);
}
}