176 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			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,
 | |
|     ),
 | |
|   );
 | |
| } |