Files
2026-09-15 15:44:13 +07:00

62 lines
2.3 KiB
Dart

import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
/// 通用居中弹窗壳:背景高斯模糊 + 金棕渐变卡片,内容由调用方传。
/// 弹出走 Get.dialog,关闭统一 Get.back()
class CommonDialog extends StatelessWidget {
final Widget child;
final EdgeInsetsGeometry margin;
final EdgeInsetsGeometry padding;
/// 点卡片内容区能不能关:默认能(点空白处的手势冒泡给外层)。
/// 带输入框/需要用户明确选择的弹窗传 false,否则点一下正文就误关了
final bool canTapClose;
/// 点卡片外的模糊区能不能关。
/// ⚠️ 本组件铺满全屏并吃掉点击,[Get.dialog] 的 barrierDismissible 到不了这层,
/// 要做「必须点按钮」的弹窗只能靠这个参数
final bool barrierDismissible;
const CommonDialog({
super.key,
required this.child,
this.margin = const EdgeInsets.symmetric(horizontal: 32),
this.padding = const EdgeInsets.fromLTRB(24, 32, 24, 24),
this.canTapClose = true,
this.barrierDismissible = true,
});
@override
Widget build(BuildContext context) {
return Material(
color: Colors.transparent, //别设成实色,渲染会有延迟
child: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: barrierDismissible ? Get.back : null, //点模糊背景关闭;null 则整层只是吃掉点击
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 4, sigmaY: 4),
child: Center(
child: GestureDetector(
behavior: HitTestBehavior.opaque,
//空回调=在手势竞技场吃掉这一下,外层收不到就关不掉;给 null 则让外层关
onTap: canTapClose ? null : () {},
child: Container(
margin: margin,
padding: padding,
decoration: const BoxDecoration(
gradient: LinearGradient(colors: [Color(0xff4d2817), Color(0xff12110f), Color(0xff302814)]),
border: Border.fromBorderSide(BorderSide(color: Color(0xff61563a))),
borderRadius: BorderRadius.all(Radius.circular(20)),
),
child: child,
),
),
),
),
),
);
}
}