79 lines
2.4 KiB
Dart
79 lines
2.4 KiB
Dart
|
|
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),
|
|||
|
|
),
|
|||
|
|
],
|
|||
|
|
);
|
|||
|
|
},
|
|||
|
|
);
|
|||
|
|
}
|