108 lines
2.9 KiB
Dart
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);
|
|
}
|