Files
feature-next-arch/lib/features/home/presentation/widgets/common/input_confirm_dialog.dart
2026-02-28 15:50:31 +08:00

79 lines
2.4 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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),
),
],
);
},
);
}