62 lines
2.3 KiB
Dart
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,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|