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, ), ), ), ), ), ); } }