Files
food_hub_app/lib/widgets/common/form.dart
2026-06-27 17:12:38 +08:00

108 lines
2.9 KiB
Dart

import 'package:flutter/material.dart';
import 'index.dart';
/// 通用输入框样式
InputDecoration buildInputDecoration({
required BuildContext context,
required String hintText,
IconData? prefixIcon,
}) {
final colors = Theme.of(context).colorScheme;
return InputDecoration(
hintText: hintText,
hintStyle: Theme.of(context).textTheme.bodyMedium,
filled: true,
fillColor: colors.surface,
enabledBorder: OutlineInputBorder(
borderSide: BorderSide.none,
borderRadius: BorderRadius.circular(10),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: colors.primary, width: 2),
borderRadius: BorderRadius.circular(10),
),
errorBorder: OutlineInputBorder(
borderSide: const BorderSide(color: Colors.red, width: 2),
borderRadius: BorderRadius.circular(10),
),
contentPadding: const EdgeInsets.symmetric(horizontal: 15, vertical: 14),
errorStyle: const TextStyle(fontSize: 12, height: 1, color: Colors.red),
prefixIcon:
prefixIcon != null
? Icon(prefixIcon, size: 20, color: colors.primary)
: null,
prefixIconConstraints: const BoxConstraints(minWidth: 40),
isDense: true,
);
}
Widget buildFormLabel({
required BuildContext context,
required String text,
required bool isRequired,
}) {
final colors = Theme.of(context).colorScheme;
return RichText(
text: TextSpan(
text: text,
style: TextStyle(
color: colors.onSurface,
fontSize: 16,
fontWeight: FontWeight.w500,
fontFamily: 'CustomFont',
height: 1.2,
),
children: [
if (isRequired)
const TextSpan(
text: ' *',
style: TextStyle(color: Colors.red, fontSize: 16),
),
],
),
);
}
/// 表单底部按钮组组件
Widget buildFormButtonGroup({
required BuildContext context,
required bool isShowDelete,
required VoidCallback onConfirm,
required VoidCallback onDelete,
}) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(child: _buildCancelButton(context)),
if (isShowDelete) ...[
SizedBox(width: 16),
Expanded(child: _buildDeleteButton(context, onDelete)),
],
SizedBox(width: 16),
Expanded(child: _buildSubmitButton(context, onConfirm)),
],
);
}
/// 取消按钮
Widget _buildCancelButton(BuildContext context) {
return buildInfoButton(
context: context,
text: '取消',
onPressed: () => Navigator.pop(context),
);
}
/// 提交按钮
Widget _buildSubmitButton(BuildContext context, VoidCallback onConfirm) {
return buildPrimaryButton(context: context, text: '提交', onPressed: onConfirm);
}
/// 删除按钮
Widget _buildDeleteButton(BuildContext context, VoidCallback onDelete) {
return buildErrorButton(text: '删除', onPressed: onDelete);
}