qhd-prevention-flutter/lib/pages/home/work_alert.dart

176 lines
5.6 KiB
Dart

import 'package:flutter/material.dart';
// 自定义弹窗组件
class WorkAlertDialog extends StatefulWidget {
final String alertTitle; // 弹窗标题
final String inputHint; // 输入框提示文本
final String contentHint; // 内容框提示文本
final String initialTitle; // 标题初始值
final String initialContent; // 内容初始值
final Function(String, String) onConfirm; // 确定回调
final VoidCallback? onCancel; // 取消回调
const WorkAlertDialog({
super.key,
required this.alertTitle,
this.inputHint = "请输入标题",
this.contentHint = "请输入内容",
this.initialTitle = "",
this.initialContent = "",
required this.onConfirm,
this.onCancel,
});
@override
State<WorkAlertDialog> createState() => _WorkAlertDialogState();
}
class _WorkAlertDialogState extends State<WorkAlertDialog> {
late TextEditingController _titleController;
late TextEditingController _contentController;
@override
void initState() {
super.initState();
_titleController = TextEditingController(text: widget.initialTitle);
_contentController = TextEditingController(text: widget.initialContent);
}
@override
Widget build(BuildContext context) {
return Dialog(
backgroundColor: Colors.transparent,
child: Container(
width: MediaQuery.of(context).size.width * 0.6,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(5),
),
padding: const EdgeInsets.all(15),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// 弹窗标题
Text(
widget.alertTitle,
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 5),
// 标题输入框
TextField(
controller: _titleController,
decoration: InputDecoration(
border: const OutlineInputBorder(),
hintText: widget.inputHint,
contentPadding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8),
),
),
const SizedBox(height: 20),
// 内容标题
const Text(
'内容:',
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
),
const SizedBox(height: 5),
// 内容输入框
TextField(
controller: _contentController,
maxLines: 4,
decoration: InputDecoration(
border: const OutlineInputBorder(),
hintText: widget.contentHint,
contentPadding: const EdgeInsets.symmetric(horizontal: 10, vertical: 12),
),
),
const SizedBox(height: 10),
Padding(
padding: EdgeInsets.only(left: 40, right: 40),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
ElevatedButton(
child: const Text('确定', style: TextStyle(color: Colors.white, fontSize: 14),),
style: ElevatedButton.styleFrom(
// maximumSize: Size(50, 30),
minimumSize: Size(50, 30),
backgroundColor: Colors.blue,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(5),
),
),
onPressed: () {
Navigator.of(context).pop(); // 关闭弹窗
widget.onConfirm(
_titleController.text,
_contentController.text
);
},
),
ElevatedButton(
onPressed: () {
Navigator.of(context).pop(); // 关闭弹窗
widget.onCancel?.call();
},
style: ElevatedButton.styleFrom(
// maximumSize: Size(50, 30),
minimumSize: Size(50, 30),
backgroundColor: Colors.red,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(5),
),
),
child: const Text('取消', style: TextStyle(color: Colors.white, fontSize: 14),),
)
],
),
)
// 按钮行
],
),
),
);
}
@override
void dispose() {
_titleController.dispose();
_contentController.dispose();
super.dispose();
}
}
// 在其他页面调用弹窗的方法
void showWorkAlert({
required BuildContext context,
required String alertTitle,
String inputHint = "请输入标题",
String contentHint = "请输入内容",
String initialTitle = "",
String initialContent = "",
required Function(String title, String content) onConfirm,
VoidCallback? onCancel,
}) {
showDialog(
context: context,
barrierColor: Colors.black.withOpacity(0.5), // 黑色半透明背景
builder: (context) => WorkAlertDialog(
alertTitle: alertTitle,
inputHint: inputHint,
contentHint: contentHint,
initialTitle: initialTitle,
initialContent: initialContent,
onConfirm: onConfirm,
onCancel: onCancel,
),
);
}