feat: login page
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:line_icons/line_icon.dart';
|
||||
import 'package:line_icons/line_icons.dart';
|
||||
|
||||
import '../../../common/theme/theme.dart';
|
||||
import '../spacer/spacer.dart';
|
||||
|
||||
part 'password_text_form_field.dart';
|
||||
part 'text_form_field.dart';
|
||||
@@ -0,0 +1,69 @@
|
||||
part of 'field.dart';
|
||||
|
||||
class AppPasswordTextFormField extends StatefulWidget {
|
||||
const AppPasswordTextFormField({
|
||||
super.key,
|
||||
this.controller,
|
||||
required this.title,
|
||||
this.hintText,
|
||||
required this.prefixIcon,
|
||||
this.validator,
|
||||
});
|
||||
|
||||
final TextEditingController? controller;
|
||||
final String title;
|
||||
final String? hintText;
|
||||
final IconData prefixIcon;
|
||||
final String? Function(String?)? validator;
|
||||
|
||||
@override
|
||||
State<AppPasswordTextFormField> createState() =>
|
||||
_AppPasswordTextFormFieldState();
|
||||
}
|
||||
|
||||
class _AppPasswordTextFormFieldState extends State<AppPasswordTextFormField> {
|
||||
bool _obscurePassword = true;
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
widget.title,
|
||||
style: AppStyle.lg.copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: AppColor.textPrimary,
|
||||
),
|
||||
),
|
||||
const SpaceHeight(8),
|
||||
TextFormField(
|
||||
controller: widget.controller,
|
||||
keyboardType: TextInputType.emailAddress,
|
||||
cursorColor: AppColor.primary,
|
||||
obscureText: _obscurePassword,
|
||||
style: AppStyle.md.copyWith(color: AppColor.textPrimary),
|
||||
decoration: InputDecoration(
|
||||
hintText: widget.hintText,
|
||||
prefixIcon: LineIcon(
|
||||
widget.prefixIcon,
|
||||
color: AppColor.textSecondary,
|
||||
),
|
||||
suffixIcon: IconButton(
|
||||
padding: EdgeInsets.zero,
|
||||
icon: Icon(
|
||||
_obscurePassword ? LineIcons.eye : LineIcons.eyeSlash,
|
||||
color: AppColor.textSecondary,
|
||||
),
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
_obscurePassword = !_obscurePassword;
|
||||
});
|
||||
},
|
||||
),
|
||||
),
|
||||
validator: widget.validator,
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
part of 'field.dart';
|
||||
|
||||
class AppTextFormField extends StatelessWidget {
|
||||
const AppTextFormField({
|
||||
super.key,
|
||||
this.controller,
|
||||
required this.title,
|
||||
this.hintText,
|
||||
required this.prefixIcon,
|
||||
this.validator,
|
||||
});
|
||||
|
||||
final TextEditingController? controller;
|
||||
final String title;
|
||||
final String? hintText;
|
||||
final IconData prefixIcon;
|
||||
final String? Function(String?)? validator;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
title,
|
||||
style: AppStyle.lg.copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: AppColor.textPrimary,
|
||||
),
|
||||
),
|
||||
const SpaceHeight(8),
|
||||
TextFormField(
|
||||
controller: controller,
|
||||
keyboardType: TextInputType.emailAddress,
|
||||
cursorColor: AppColor.primary,
|
||||
style: AppStyle.md.copyWith(color: AppColor.textPrimary),
|
||||
decoration: InputDecoration(
|
||||
hintText: hintText,
|
||||
prefixIcon: LineIcon(prefixIcon, color: AppColor.textSecondary),
|
||||
),
|
||||
validator: validator,
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user