Skip to content

Commit c36eaa0

Browse files
committed
Fix: duplicated form key for both form types
1 parent d432291 commit c36eaa0

File tree

9 files changed

+110
-58
lines changed

9 files changed

+110
-58
lines changed

devtools_options.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
extensions:

lib/controllers/providers/form_provider.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import 'package:flutter/material.dart';
22

33
class FormProvider with ChangeNotifier {
4-
final _fromKey = GlobalKey<FormState>();
4+
final _loginFormKey = GlobalKey<FormState>();
5+
final _signUpFormKey = GlobalKey<FormState>();
56
bool _showPassword = false;
67
final _emailController = TextEditingController();
78
final _passwordController = TextEditingController();
@@ -18,5 +19,6 @@ class FormProvider with ChangeNotifier {
1819
TextEditingController get emailController => _emailController;
1920
TextEditingController get passwordController => _passwordController;
2021
TextEditingController get rePasswordController => _rePasswordController;
21-
get formKey => _fromKey;
22+
GlobalKey<FormState> get loginFormKey => _loginFormKey;
23+
GlobalKey<FormState> get signUpFormKey => _signUpFormKey;
2224
}

lib/router/router.dart

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import "package:dbu_gym/views/pages/login_page.dart";
33
import "package:dbu_gym/views/pages/not_found_page.dart";
44
import "package:dbu_gym/views/pages/welcome_page.dart";
55
import 'package:dbu_gym/views/pages/sign_up_page.dart';
6-
import 'package:dbu_gym/views/pages/sign_up_intermediate_page.dart';
76

87
class AppRouter {
98
static final router = GoRouter(
@@ -23,11 +22,11 @@ class AppRouter {
2322
name: "signup",
2423
builder: (context, state) => SignUpPage(),
2524
),
26-
GoRoute(
27-
path: "/signup-intermediate",
28-
name: "signup-intermediate",
29-
builder: (context, state) => SignUpIntermediatePage(),
30-
),
25+
// GoRoute(
26+
// path: "/signup-intermediate",
27+
// name: "signup-intermediate",
28+
// builder: (context, state) => SignUpIntermediatePage(),
29+
// ),
3130
],
3231
errorBuilder: (context, state) => PageNotFound(),
3332
);

lib/views/pages/login_page.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import 'package:dbu_gym/views/widgets/widgets.dart';
22
import 'package:flutter/material.dart';
33
import 'package:go_router/go_router.dart';
4+
import 'package:provider/provider.dart';
45

56
class LoginPage extends StatelessWidget {
67
const LoginPage({super.key});
78

89
@override
910
Widget build(BuildContext context) {
11+
// final formKey = GlobalKey<FormState>();
1012
return Scaffold(
1113
appBar: AppBar(
1214
leading: IconButton(
@@ -24,7 +26,9 @@ class LoginPage extends StatelessWidget {
2426
padding: EdgeInsets.symmetric(
2527
horizontal: 28,
2628
),
27-
child: FormWidget(formType: "Login"),
29+
child: FormWidget(
30+
formType: "Login",
31+
),
2832
),
2933
),
3034
);

lib/views/pages/sign_up_intermediate_page.dart

Lines changed: 0 additions & 10 deletions
This file was deleted.

lib/views/pages/sign_up_page.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ class SignUpPage extends StatelessWidget {
77

88
@override
99
Widget build(BuildContext context) {
10+
// final formKey = GlobalKey<FormState>();
1011
return Scaffold(
1112
appBar: AppBar(
1213
leading: IconButton(
@@ -24,7 +25,9 @@ class SignUpPage extends StatelessWidget {
2425
padding: EdgeInsets.symmetric(
2526
horizontal: 28,
2627
),
27-
child: FormWidget(formType: "Sign up"),
28+
child: FormWidget(
29+
formType: "Sign up",
30+
),
2831
),
2932
),
3033
);

lib/views/widgets/widgets.dart

Lines changed: 57 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@ class FormWidget extends StatelessWidget {
1919
return SingleChildScrollView(
2020
physics: BouncingScrollPhysics(),
2121
padding: EdgeInsets.only(
22-
top: MediaQuery.of(context).size.height * 0.1,
22+
top: formType == "Login"
23+
? MediaQuery.of(context).size.height * 0.1
24+
: MediaQuery.of(context).size.height * 0.05,
2325
),
2426
child: Column(
2527
mainAxisAlignment: MainAxisAlignment.center,
2628
children: [
2729
Text(
28-
formType == "Login" ? "Welcome back!" : "It Won't take long!",
30+
formType == "Login" ? "Welcome back!" : "It won't take long!",
2931
style: Theme.of(context).textTheme.titleLarge!.copyWith(
3032
color: Theme.of(context).primaryColor,
3133
fontWeight: FontWeight.bold,
@@ -40,7 +42,9 @@ class FormWidget extends StatelessWidget {
4042
),
4143
SizedBox(height: MediaQuery.of(context).size.height * 0.02),
4244
Form(
43-
key: formProvider.formKey,
45+
key: formType == "Login"
46+
? formProvider.loginFormKey
47+
: formProvider.signUpFormKey,
4448
child: Column(
4549
mainAxisSize: MainAxisSize.min,
4650
children: [
@@ -49,7 +53,7 @@ class FormWidget extends StatelessWidget {
4953
decoration: InputDecoration(
5054
label: Text("E-mail"),
5155
labelStyle: TextStyle(color: Colors.grey),
52-
hintText: "abebe@yahoo.com",
56+
hintText: "abebe@example.com",
5357
prefixIcon: Icon(Icons.email),
5458
prefixIconColor: Colors.grey,
5559
),
@@ -96,45 +100,61 @@ class FormWidget extends StatelessWidget {
96100
return null;
97101
},
98102
),
99-
formType == "Sign up"
100-
? SizedBox(
101-
height: MediaQuery.of(context).size.height * 0.015,
102-
)
103-
: SizedBox(),
104-
formType == "Sign up"
105-
? TextFormField(
106-
controller: formProvider.rePasswordController,
107-
decoration: InputDecoration(
108-
label: Text("Re-enter password"),
109-
labelStyle: TextStyle(color: Colors.grey),
110-
prefixIcon: Icon(Icons.password),
111-
prefixIconColor: Colors.grey,
112-
),
113-
obscureText: formProvider.showPassword ? false : true,
114-
textInputAction: TextInputAction.done,
115-
validator: (value) {
116-
if (value!.isEmpty)
117-
return "Please provide a password.";
103+
if (formType == "Sign up")
104+
SizedBox(
105+
height: MediaQuery.of(context).size.height * 0.015,
106+
),
107+
if (formType == "Sign up")
108+
TextFormField(
109+
controller: formProvider.rePasswordController,
110+
decoration: InputDecoration(
111+
label: Text("Re-enter password"),
112+
labelStyle: TextStyle(color: Colors.grey),
113+
prefixIcon: Icon(Icons.password),
114+
prefixIconColor: Colors.grey,
115+
),
116+
obscureText: formProvider.showPassword ? false : true,
117+
textInputAction: TextInputAction.done,
118+
validator: (value) {
119+
if (value!.isEmpty) return "Please provide a password.";
118120

119-
if (value.length < 8) {
120-
return "Password must be at least 8 characters.";
121-
}
122-
if (formProvider.passwordController.text != value) {
123-
return "Password do not match";
124-
}
125-
return null;
126-
},
127-
)
128-
: SizedBox(),
121+
if (value.length < 8) {
122+
return "Password must be at least 8 characters.";
123+
}
124+
if (formProvider.passwordController.text != value) {
125+
return "Password do not match";
126+
}
127+
return null;
128+
},
129+
),
130+
if (formType == "Sign up")
131+
SizedBox(height: MediaQuery.of(context).size.height * 0.01),
132+
if (formType == "Sign up")
133+
Row(
134+
mainAxisAlignment: MainAxisAlignment.spaceBetween,
135+
children: [
136+
Text(
137+
"Sign up as new user",
138+
style: Theme.of(context).textTheme.bodyMedium!.copyWith(
139+
color: Theme.of(context).primaryColor,
140+
),
141+
),
142+
Switch(value: false, onChanged: (value) {})
143+
],
144+
),
129145
SizedBox(
130146
height: MediaQuery.of(context).size.height * 0.02,
131147
),
132148
FilledButton(
133149
onPressed: () {
134-
if ((Provider.of<FormProvider>(context, listen: false)
135-
.formKey as GlobalKey<FormState>)
136-
.currentState!
137-
.validate()) {}
150+
if (formType == "Login") {
151+
// valid login inputs
152+
if (formProvider.loginFormKey.currentState!.validate()) {}
153+
} else {
154+
// valid sign up inputs
155+
if (formProvider.signUpFormKey.currentState!
156+
.validate()) {}
157+
}
138158
},
139159
child: Text(formType == "Login" ? "Login" : "Sign up"),
140160
),

pubspec.lock

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,14 @@ packages:
7373
url: "https://pub.dev"
7474
source: hosted
7575
version: "2.1.17"
76+
ethiopian_calendar:
77+
dependency: "direct main"
78+
description:
79+
name: ethiopian_calendar
80+
sha256: "1577a02138eb2d279c6300dff059a4ec9d805d838d848b2ece769fd0b7895580"
81+
url: "https://pub.dev"
82+
source: hosted
83+
version: "0.0.2"
7684
fake_async:
7785
dependency: transitive
7886
description:
@@ -184,6 +192,14 @@ packages:
184192
url: "https://pub.dev"
185193
source: hosted
186194
version: "4.0.2"
195+
intl:
196+
dependency: transitive
197+
description:
198+
name: intl
199+
sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d"
200+
url: "https://pub.dev"
201+
source: hosted
202+
version: "0.18.1"
187203
js:
188204
dependency: transitive
189205
description:
@@ -320,6 +336,14 @@ packages:
320336
url: "https://pub.dev"
321337
source: hosted
322338
version: "6.1.1"
339+
simple_gesture_detector:
340+
dependency: transitive
341+
description:
342+
name: simple_gesture_detector
343+
sha256: ba2cd5af24ff20a0b8d609cec3f40e5b0744d2a71804a2616ae086b9c19d19a3
344+
url: "https://pub.dev"
345+
source: hosted
346+
version: "0.2.1"
323347
sky_engine:
324348
dependency: transitive
325349
description: flutter
@@ -365,6 +389,14 @@ packages:
365389
url: "https://pub.dev"
366390
source: hosted
367391
version: "1.2.0"
392+
table_calendar:
393+
dependency: "direct main"
394+
description:
395+
name: table_calendar
396+
sha256: "1e3521a3e6d3fc7f645a58b135ab663d458ab12504f1ea7f9b4b81d47086c478"
397+
url: "https://pub.dev"
398+
source: hosted
399+
version: "3.0.9"
368400
term_glyph:
369401
dependency: transitive
370402
description:

pubspec.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ dependencies:
4343
provider: ^6.1.1
4444
go_router: ^13.2.0
4545
email_validator: ^2.1.17
46-
46+
ethiopian_calendar: ^0.0.2
47+
table_calendar: ^3.0.9
4748
dev_dependencies:
4849
flutter_test:
4950
sdk: flutter

0 commit comments

Comments
 (0)