Files
CityCards_Partner_Flutter/lib/custome_widgets/custom_textfield.dart

119 lines
3.8 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import '../constants/app_colors.dart';
class CustomTextField extends StatelessWidget {
final String label;
final String hintText;
final TextEditingController controller;
final FocusNode? focusNode;
final IconData? prefixIcon;
final bool hasError;
final String? errorText;
final bool isPassword;
final bool isPasswordVisible;
final VoidCallback? onTogglePasswordVisibility;
final bool readOnly;
final TextInputType keyboardType;
final TextInputAction textInputAction;
final ValueChanged<String>? onChanged;
final ValueChanged<String>? onSubmitted;
final Color? accentColor;
const CustomTextField({
super.key,
required this.label,
required this.hintText,
required this.controller,
this.focusNode,
this.prefixIcon,
this.hasError = false,
this.errorText,
this.isPassword = false,
this.isPasswordVisible = false,
this.onTogglePasswordVisibility,
this.readOnly = false,
this.keyboardType = TextInputType.text,
this.textInputAction = TextInputAction.done,
this.onChanged,
this.onSubmitted,
this.accentColor,
});
@override
Widget build(BuildContext context) {
final Color primary = accentColor ?? AppColors.primaryRed;
final Color labelColor = AppColors.labelGrey;
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Text(
label,
style: GoogleFonts.poppins(
color: labelColor,
fontSize: 14.sp,
fontWeight: FontWeight.w500,
),
),
SizedBox(height: 8.h),
TextField(
controller: controller,
focusNode: focusNode,
readOnly: readOnly,
obscureText: isPassword && !isPasswordVisible,
keyboardType: keyboardType,
textInputAction: textInputAction,
style: GoogleFonts.poppins(fontSize: 14.sp),
onChanged: onChanged,
onSubmitted: onSubmitted,
decoration: InputDecoration(
hintText: hintText,
hintStyle: GoogleFonts.poppins(color: AppColors.hintGrey),
prefixIcon: prefixIcon != null
? Icon(prefixIcon, color: AppColors.hintGrey, size: 20.sp)
: null,
suffixIcon: isPassword
? IconButton(
icon: Icon(
isPasswordVisible
? Icons.visibility_outlined
: Icons.visibility_off_outlined,
color: AppColors.hintGrey,
size: 20.sp,
),
onPressed: onTogglePasswordVisibility,
)
: null,
contentPadding: EdgeInsets.symmetric(vertical: 16.h, horizontal: 16.w),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12.r),
borderSide: BorderSide(
color: hasError ? primary : AppColors.borderGrey,
),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12.r),
borderSide: BorderSide(color: primary),
),
disabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12.r),
borderSide: BorderSide(color: AppColors.borderGrey.withOpacity(0.5)),
),
),
),
if (hasError && errorText != null)
Padding(
padding: EdgeInsets.only(top: 4.h),
child: Text(
errorText!,
style: GoogleFonts.poppins(color: primary, fontSize: 12.sp),
),
),
],
);
}
}