Files
flutterApp/lib/components/input_confirm_dialog.dart

79 lines
2.4 KiB
Dart
Raw Normal View History

2026-02-28 15:50:31 +08:00
import 'package:flutter/material.dart';
/// 通用带输入框的确认弹窗组件
/// [title]:弹窗标题
/// [hintText]:输入框提示文字
/// [labelText]:输入框标签文字
/// [confirmText]:确认按钮文字(默认"保存")
/// [cancelText]:取消按钮文字(默认"取消")
/// [onConfirm]:确认按钮回调,参数为输入的文本,返回bool表示是否关闭弹窗
/// [inputValidator]:输入内容校验器,返回null表示校验通过,返回字符串表示错误提示
Future<void> showInputConfirmDialog({
required BuildContext context,
required String title,
required String hintText,
String labelText = '',
String confirmText = '保存',
String cancelText = '取消',
required Function(String inputText) onConfirm,
String? Function(String inputText)? inputValidator,
}) async {
// 输入框控制器
final TextEditingController _controller = TextEditingController();
await showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text(title),
content: TextField(
controller: _controller,
decoration: InputDecoration(
hintText: hintText,
border: const OutlineInputBorder(),
labelText: labelText,
),
autofocus: true, // 自动聚焦输入框
),
actions: [
// 取消按钮
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text(cancelText),
),
// 确认按钮
TextButton(
onPressed: () {
// 获取输入文本并去空格
final String inputText = _controller.text.trim();
// 1. 执行自定义校验
if (inputValidator != null) {
final String? errorMsg = inputValidator(inputText);
if (errorMsg != null) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(errorMsg),
backgroundColor: Colors.red,
),
);
return;
}
}
// 2. 执行确认回调
onConfirm(inputText);
// 3. 关闭弹窗
Navigator.of(context).pop();
},
child: Text(confirmText),
),
],
);
},
);
}