Skip to content

Commit a74281c

Browse files
author
Freek van de Ven
committed
fix: stop the keyboard from closing immediately after opening because of a valuekey update
The hashcode of the LoginOptions was not consistent so it would force the field to rebuild when the keyboard would open. I added equatable to get a reliable hashCode.
1 parent 6319ecd commit a74281c

7 files changed

Lines changed: 90 additions & 10 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 6.3.1
2+
3+
- Fixed a bug where the keyboard for the login username and password fields was closing because of a different LoginOptions.hashCode with the same LoginOptions values.
4+
15
## 6.3.0
26

37
- Added CustomSemantics widget that is used to wrap all the inputfields and buttons to make the component accessible for e2e testing.

packages/firebase_user_repository/pubspec.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: firebase_user_repository
22
description: "firebase_user_repository for flutter_user package"
3-
version: 6.3.0
3+
version: 6.3.1
44
repository: https://github.com/Iconica-Development/flutter_user
55

66
publish_to: https://forgejo.internal.iconica.nl/api/packages/internal/pub
@@ -14,7 +14,7 @@ dependencies:
1414
sdk: flutter
1515
user_repository_interface:
1616
hosted: https://forgejo.internal.iconica.nl/api/packages/internal/pub/
17-
version: ^6.3.0
17+
version: ^6.3.1
1818
cloud_firestore: ^5.4.2
1919
firebase_auth: ^5.3.0
2020

packages/flutter_user/lib/src/models/login/login_options.dart

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import "dart:async";
22

3+
import "package:equatable/equatable.dart";
34
import "package:flutter/material.dart";
45
import "package:flutter_user/src/models/login/login_spacer_options.dart";
56
import "package:flutter_user/src/models/login/login_translations.dart";
67
import "package:flutter_user/src/services/login_validation.dart";
78
import "package:flutter_user/src/services/validation_service.dart";
89

9-
class LoginOptions {
10+
@immutable
11+
class LoginOptions extends Equatable {
1012
const LoginOptions({
1113
this.image,
1214
this.spacers = const LoginSpacerOptions(),
@@ -96,9 +98,33 @@ class LoginOptions {
9698

9799
ValidationService get validations =>
98100
validationService ?? LoginValidationService(this);
101+
102+
@override
103+
List<Object?> get props => [
104+
// image is not added because it is a widget without Equatable
105+
spacers,
106+
translations,
107+
validationService,
108+
maxFormWidth,
109+
initialEmail,
110+
initialPassword,
111+
emailTextAlign,
112+
emailTextStyle,
113+
passwordTextAlign,
114+
passwordTextStyle,
115+
showObscurePassword,
116+
suffixIconSize,
117+
suffixIconPadding,
118+
loginBackgroundColor,
119+
forgotPasswordButtonBuilder.runtimeType,
120+
loginButtonBuilder.runtimeType,
121+
registrationButtonBuilder.runtimeType,
122+
emailInputContainerBuilder.runtimeType,
123+
passwordInputContainerBuilder.runtimeType,
124+
];
99125
}
100126

101-
class LoginBiometricsOptions {
127+
class LoginBiometricsOptions extends Equatable {
102128
const LoginBiometricsOptions({
103129
this.loginWithBiometrics = false,
104130
this.triggerBiometricsAutomatically = false,
@@ -128,10 +154,20 @@ class LoginBiometricsOptions {
128154

129155
/// The callback function to be called when the biometrics login errors.
130156
final LoginOptionalAsyncCallback? onBiometricsError;
157+
158+
@override
159+
List<Object?> get props => [
160+
loginWithBiometrics,
161+
triggerBiometricsAutomatically,
162+
allowBiometricsAlternative,
163+
onBiometricsSuccess,
164+
onBiometricsFail,
165+
onBiometricsError,
166+
];
131167
}
132168

133169
/// Accessibility identifiers for the login widgets of the userstory.
134-
class LoginAccessibilityIdentifiers {
170+
class LoginAccessibilityIdentifiers extends Equatable {
135171
/// Default [LoginAccessibilityIdentifiers] constructor where all the
136172
/// identifiers are required. This is to ensure that apps automatically break
137173
/// when new identifiers are added.
@@ -179,6 +215,17 @@ class LoginAccessibilityIdentifiers {
179215

180216
/// Identifier for the biometrics button.
181217
final String biometricsButtonIdentifier;
218+
219+
@override
220+
List<Object?> get props => [
221+
emailTextFieldIdentifier,
222+
passwordTextFieldIdentifier,
223+
loginButtonIdentifier,
224+
forgotPasswordButtonIdentifier,
225+
requestForgotPasswordButtonIdentifier,
226+
registrationButtonIdentifier,
227+
biometricsButtonIdentifier,
228+
];
182229
}
183230

184231
Widget _createForgotPasswordButton(

packages/flutter_user/lib/src/models/login/login_spacer_options.dart

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
import "package:equatable/equatable.dart";
12
import "package:flutter/material.dart";
23

34
@immutable
4-
class LoginSpacerOptions {
5+
class LoginSpacerOptions extends Equatable {
56
const LoginSpacerOptions({
67
this.spacerAfterSubtitle,
78
this.spacerAfterImage,
@@ -36,4 +37,16 @@ class LoginSpacerOptions {
3637
final int formFlexValue;
3738

3839
final int titleSpacer;
40+
41+
@override
42+
List<Object?> get props => [
43+
spacerBeforeTitle,
44+
spacerAfterTitle,
45+
spacerAfterSubtitle,
46+
spacerAfterImage,
47+
spacerAfterForm,
48+
spacerAfterButton,
49+
formFlexValue,
50+
titleSpacer,
51+
];
3952
}

packages/flutter_user/lib/src/models/login/login_translations.dart

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
class LoginTranslations {
1+
import "package:equatable/equatable.dart";
2+
3+
class LoginTranslations extends Equatable {
24
const LoginTranslations({
35
this.loginTitle = "log in",
46
this.loginSubtitle,
@@ -25,4 +27,17 @@ class LoginTranslations {
2527

2628
final String registrationButton;
2729
final String biometricsLoginMessage;
30+
31+
@override
32+
List<Object?> get props => [
33+
loginTitle,
34+
loginSubtitle,
35+
emailEmpty,
36+
passwordEmpty,
37+
emailInvalid,
38+
loginButton,
39+
forgotPasswordButton,
40+
registrationButton,
41+
biometricsLoginMessage,
42+
];
2843
}

packages/flutter_user/pubspec.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: flutter_user
22
description: "Flutter Userstory for onboarding, login, and registration."
3-
version: 6.3.0
3+
version: 6.3.1
44
repository: https://github.com/Iconica-Development/flutter_user
55

66
publish_to: https://forgejo.internal.iconica.nl/api/packages/internal/pub
@@ -13,6 +13,7 @@ dependencies:
1313
flutter:
1414
sdk: flutter
1515
local_auth: ^2.3.0
16+
equatable: ^2.0.0
1617
flutter_input_library:
1718
hosted: https://forgejo.internal.iconica.nl/api/packages/internal/pub/
1819
version: ^3.7.0
@@ -21,7 +22,7 @@ dependencies:
2122
version: ^4.1.0
2223
user_repository_interface:
2324
hosted: https://forgejo.internal.iconica.nl/api/packages/internal/pub/
24-
version: ^6.3.0
25+
version: ^6.3.1
2526
flutter_accessibility:
2627
hosted: https://forgejo.internal.iconica.nl/api/packages/internal/pub
2728
version: ^0.0.3

packages/user_repository_interface/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: user_repository_interface
22
description: "user_repository_interface for flutter_user package"
3-
version: 6.3.0
3+
version: 6.3.1
44
repository: https://github.com/Iconica-Development/flutter_user
55

66
publish_to: https://forgejo.internal.iconica.nl/api/packages/internal/pub

0 commit comments

Comments
 (0)