feat: 修改hidialog弹窗位置,增加macos dmg打包配置

This commit is contained in:
2026-01-12 00:45:52 -08:00
parent 2d1f391932
commit e6ee3d6db8
22 changed files with 393 additions and 157 deletions
+147 -114
View File
@@ -24,6 +24,9 @@ class HIDialog extends StatefulWidget {
/// 是否显示按钮 loadingautoClose=false 时自动启用)
final bool? showLoading;
final Offset? targetOffset;
static double get kDialogWidth => 245.w < 280.0 ? 280.0 : 245.w;
const HIDialog({
Key? key,
@@ -38,6 +41,7 @@ class HIDialog extends StatefulWidget {
this.preventBackDismiss = false,
this.autoClose = true,
this.showLoading,
this.targetOffset,
}) : super(key: key);
static Future<void> show({
@@ -52,6 +56,7 @@ class HIDialog extends StatefulWidget {
bool preventBackDismiss = false,
bool autoClose = true,
bool? showLoading,
Offset? targetOffset,
}) {
return Get.dialog(
HIDialog(
@@ -66,9 +71,11 @@ class HIDialog extends StatefulWidget {
preventBackDismiss: preventBackDismiss,
autoClose: autoClose,
showLoading: showLoading,
targetOffset: targetOffset,
),
barrierDismissible: barrierDismissible,
barrierColor: Colors.transparent,
useSafeArea: false,
);
}
@@ -112,20 +119,127 @@ class _HIDialogState extends State<HIDialog> {
),
child: _isLoading
? SizedBox(
height: 20.w,
width: 20.w,
child: const CircularProgressIndicator(
color: Colors.black,
strokeWidth: 2,
),
)
height: 20.w,
width: 20.w,
child: const CircularProgressIndicator(
color: Colors.black,
strokeWidth: 2,
),
)
: Text(
widget.confirmText ?? (widget.cancelText == null ? '好的' : AppTranslations.kr_dialog.kr_confirm),
style: TextStyle(
fontSize: 16.sp,
fontWeight: FontWeight.w600,
color: Colors.black,
fontFamily: 'AlibabaPuHuiTi-Medium',
widget.confirmText ??
(widget.cancelText == null ? '好的' : AppTranslations.kr_dialog.kr_confirm),
style: TextStyle(
fontSize: 16.sp,
fontWeight: FontWeight.w600,
color: Colors.black,
fontFamily: 'AlibabaPuHuiTi-Medium',
),
),
);
}
Widget _buildDialogContent() {
return ClipRRect(
borderRadius: BorderRadius.circular(34.r),
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 26, sigmaY: 26), // 毛玻璃模糊
child: Container(
width: 245.w,
padding: EdgeInsets.fromLTRB(30.w, 16.w, 30.w, 16.w),
decoration: BoxDecoration(
color: const Color(0xFFDEDEDE), // 半透明底色
borderRadius: BorderRadius.circular(34.r),
border: Border.all(
color: Colors.white.withOpacity(0.2), // 高光边框
width: 1.5,
),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
if (widget.title != null) ...[
Align(
alignment: Alignment.centerLeft,
child: Text(
widget.title!,
style: TextStyle(
fontSize: 14.sp,
fontWeight: FontWeight.w600,
color: Colors.black,
height: 1.3,
),
),
),
SizedBox(height: 4.w),
],
if (widget.message != null || widget.customMessageWidget != null) ...[
Container(
constraints: BoxConstraints(maxHeight: 200.h),
child: SingleChildScrollView(
child: widget.customMessageWidget ??
Text(
widget.message!,
textAlign: TextAlign.left,
style: TextStyle(
fontSize: 14.sp,
color: Colors.black,
height: 1.4,
fontFamily: 'AlibabaPuHuiTi-Medium',
),
),
),
),
],
if (widget.confirmText != null ||
widget.cancelText != null ||
(widget.confirmText == null && widget.cancelText == null)) ...[
SizedBox(height: 12.w),
if (widget.confirmText == null && widget.cancelText == null)
Center(
child: SizedBox(
width: 85.w,
child: _buildConfirmButton(),
),
)
else
Row(
children: [
if (widget.confirmText != null) Expanded(child: _buildConfirmButton()),
if (widget.cancelText != null && widget.confirmText != null)
SizedBox(width: 12.w),
if (widget.cancelText != null)
Expanded(
child: TextButton(
onPressed: () {
Get.back();
widget.onCancel?.call();
},
style: TextButton.styleFrom(
backgroundColor: const Color(0xFFFF00B7),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(23.r),
),
minimumSize: Size(85.w, 40.w),
padding: EdgeInsets.zero,
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
),
child: Text(
widget.cancelText!,
style: TextStyle(
fontSize: 16.sp,
fontWeight: FontWeight.w600,
color: Colors.black,
fontFamily: 'AlibabaPuHuiTi-Medium',
),
),
),
),
],
),
]
],
),
),
),
);
@@ -133,112 +247,31 @@ class _HIDialogState extends State<HIDialog> {
@override
Widget build(BuildContext context) {
if (widget.targetOffset != null) {
return Stack(
fit: StackFit.expand,
children: [
Positioned(
left: widget.targetOffset!.dx,
top: widget.targetOffset!.dy,
child: Material(
type: MaterialType.transparency,
child: ConstrainedBox(
constraints: const BoxConstraints(minWidth: 280.0),
child: _buildDialogContent(),
),
),
),
],
);
}
final dialog = Dialog(
backgroundColor: Colors.transparent,
insetPadding: EdgeInsets.all(20.w),
child: Transform.translate(
offset: Offset(0, -30.w),
child: ClipRRect(
borderRadius: BorderRadius.circular(34.r),
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 26, sigmaY: 26), // 毛玻璃模糊
child: Container(
width: 245.w,
padding: EdgeInsets.fromLTRB(30.w, 16.w, 30.w, 16.w),
decoration: BoxDecoration(
color: const Color(0xFFDEDEDE), // 半透明底色
borderRadius: BorderRadius.circular(34.r),
border: Border.all(
color: Colors.white.withOpacity(0.2), // 高光边框
width: 1.5,
),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
if (widget.title != null) ...[
Align(
alignment: Alignment.centerLeft,
child: Text(
widget.title!,
style: TextStyle(
fontSize: 14.sp,
fontWeight: FontWeight.w600,
color: Colors.black,
height: 1.3,
),
),
),
SizedBox(height: 4.w),
],
if (widget.message != null || widget.customMessageWidget != null) ...[
Container(
constraints: BoxConstraints(maxHeight: 200.h),
child: SingleChildScrollView(
child: widget.customMessageWidget ??
Text(
widget.message!,
textAlign: TextAlign.left,
style: TextStyle(
fontSize: 14.sp,
color: Colors.black,
height: 1.4,
fontFamily: 'AlibabaPuHuiTi-Medium',
),
),
),
),
],
if (widget.confirmText != null || widget.cancelText != null || (widget.confirmText == null && widget.cancelText == null)) ...[
SizedBox(height: 12.w),
if (widget.confirmText == null && widget.cancelText == null)
Center(
child: SizedBox(
width: 85.w,
child: _buildConfirmButton(),
),
)
else
Row(
children: [
if (widget.confirmText != null) Expanded(child: _buildConfirmButton()),
if (widget.cancelText != null && widget.confirmText != null)
SizedBox(width: 12.w),
if (widget.cancelText != null)
Expanded(
child: TextButton(
onPressed: () {
Get.back();
widget.onCancel?.call();
},
style: TextButton.styleFrom(
backgroundColor: const Color(0xFFFF00B7),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(23.r),
),
minimumSize: Size(85.w, 40.w),
padding: EdgeInsets.zero,
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
),
child: Text(
widget.cancelText!,
style: TextStyle(
fontSize: 16.sp,
fontWeight: FontWeight.w600,
color: Colors.black,
fontFamily: 'AlibabaPuHuiTi-Medium',
),
),
),
),
],
),
]
],
),
),
),
),
child: _buildDialogContent(),
),
);