Improvements:

- Login & Register page submit button debounce
- Snack bar show failure info
This commit is contained in:
Linloir 2022-10-20 21:00:47 +08:00
parent dba8e0bb52
commit f40d0987ce
No known key found for this signature in database
GPG Key ID: 58EEB209A0F2C366
9 changed files with 54 additions and 28 deletions

View File

@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-12 15:38:07
* @LastEditTime : 2022-10-12 17:36:53
* @LastEditTime : 2022-10-20 20:51:09
* @Description :
*/
@ -47,7 +47,8 @@ class LoginCubit extends Cubit<LoginState> {
Future<void> onSubmission() async {
if(state.status.isValidated) {
emit(state.copyWith(
status: FormzStatus.submissionInProgress
status: FormzStatus.submissionInProgress,
info: ""
));
tcpRepository.pushRequest(LoginRequest(
identity: UserIdentity(
@ -67,7 +68,8 @@ class LoginCubit extends Cubit<LoginState> {
}
else {
emit(state.copyWith(
status: FormzStatus.submissionFailure
status: FormzStatus.submissionFailure,
info: response.info?.replaceAll('Exception: ', ''),
));
}
break;

View File

@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-12 15:38:13
* @LastEditTime : 2022-10-12 16:24:42
* @LastEditTime : 2022-10-20 20:49:43
* @Description :
*/
@ -16,28 +16,32 @@ class LoginState extends Equatable {
final String avatar;
final FormzStatus status;
final String info;
const LoginState({
this.status = FormzStatus.pure,
this.username = const Username.pure(),
this.password = const Password.pure(),
this.avatar = ""
this.avatar = "",
this.info = ""
});
LoginState copyWith({
FormzStatus? status,
Username? username,
Password? password,
String? avatar
String? avatar,
String? info,
}) {
return LoginState(
status: status ?? this.status,
username: username ?? this.username,
password: password ?? this.password,
avatar: avatar ?? this.avatar
avatar: avatar ?? this.avatar,
info: info ?? this.info
);
}
@override
List<Object?> get props => [status, username, password, avatar];
List<Object?> get props => [status, username, password, avatar, info];
}

View File

@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-12 15:06:30
* @LastEditTime : 2022-10-14 10:47:08
* @LastEditTime : 2022-10-20 20:55:07
* @Description :
*/
@ -46,11 +46,13 @@ class LoginPage extends StatelessWidget {
body: BlocListener<LoginCubit, LoginState>(
listener:(context, state) {
if(state.status == FormzStatus.submissionFailure) {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Login Failed'))
SnackBar(content: Text('Login Failed${state.info.isNotEmpty ? ': ${state.info}' : ''}'))
);
}
else if(state.status == FormzStatus.submissionSuccess) {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Login Successed'))
);

View File

@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-12 16:29:25
* @LastEditTime : 2022-10-12 17:31:23
* @LastEditTime : 2022-10-20 20:43:51
* @Description :
*/
@ -103,8 +103,13 @@ class SubmitButton extends StatelessWidget {
}),
overlayColor: MaterialStateProperty.all(Colors.blue[900]!.withOpacity(0.2))
),
onPressed: state.status == FormzStatus.submissionInProgress ? null : () {
context.read<LoginCubit>().onSubmission();
onPressed: () {
if(
state.status == FormzStatus.valid ||
state.status == FormzStatus.submissionFailure
) {
context.read<LoginCubit>().onSubmission();
}
},
child: state.status == FormzStatus.submissionInProgress ?
const SizedBox(

View File

@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-10 08:04:53
* @LastEditTime : 2022-10-20 17:58:56
* @LastEditTime : 2022-10-20 20:38:45
* @Description :
*/
import 'package:easy_debounce/easy_debounce.dart';
@ -119,7 +119,7 @@ class SplashPage extends StatelessWidget {
return BlocProvider<InitializationCubit>(
create: (context) {
return InitializationCubit(
serverAddress: 'chat.linloir.cn',
serverAddress: '127.0.0.1',
serverPort: 20706
);
},

View File

@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-12 15:38:07
* @LastEditTime : 2022-10-12 17:52:03
* @LastEditTime : 2022-10-20 20:53:03
* @Description :
*/
@ -47,7 +47,8 @@ class RegisterCubit extends Cubit<RegisterState> {
Future<void> onSubmission() async {
if(state.status.isValidated) {
emit(state.copyWith(
status: FormzStatus.submissionInProgress
status: FormzStatus.submissionInProgress,
info: ""
));
tcpRepository.pushRequest(RegisterRequest(
identity: UserIdentity(
@ -67,7 +68,8 @@ class RegisterCubit extends Cubit<RegisterState> {
}
else {
emit(state.copyWith(
status: FormzStatus.submissionFailure
status: FormzStatus.submissionFailure,
info: response.info?.replaceAll('Exception: ', ''),
));
}
break;

View File

@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-12 15:38:13
* @LastEditTime : 2022-10-12 17:40:39
* @LastEditTime : 2022-10-20 20:52:19
* @Description :
*/
@ -16,28 +16,32 @@ class RegisterState extends Equatable {
final String avatar;
final FormzStatus status;
final String info;
const RegisterState({
this.status = FormzStatus.pure,
this.username = const Username.pure(),
this.password = const Password.pure(),
this.avatar = ""
this.avatar = "",
this.info = ""
});
RegisterState copyWith({
FormzStatus? status,
Username? username,
Password? password,
String? avatar
String? avatar,
String? info,
}) {
return RegisterState(
status: status ?? this.status,
username: username ?? this.username,
password: password ?? this.password,
avatar: avatar ?? this.avatar
avatar: avatar ?? this.avatar,
info: info ?? this.info
);
}
@override
List<Object?> get props => [status, username, password, avatar];
List<Object?> get props => [status, username, password, avatar, info];
}

View File

@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-12 17:36:38
* @LastEditTime : 2022-10-19 11:14:06
* @LastEditTime : 2022-10-20 20:55:17
* @Description :
*/
/*
@ -56,11 +56,13 @@ class RegisterPage extends StatelessWidget {
body: BlocListener<RegisterCubit, RegisterState>(
listener:(context, state) {
if(state.status == FormzStatus.submissionFailure) {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Register Failed'))
SnackBar(content: Text('Register Failed${state.info.isNotEmpty ? ': ${state.info}' : ''}'))
);
}
else if(state.status == FormzStatus.submissionSuccess) {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Register Successed'))
);

View File

@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-12 16:29:25
* @LastEditTime : 2022-10-12 17:44:33
* @LastEditTime : 2022-10-20 20:54:22
* @Description :
*/
@ -103,8 +103,13 @@ class SubmitButton extends StatelessWidget {
}),
overlayColor: MaterialStateProperty.all(Colors.blue[900]!.withOpacity(0.2))
),
onPressed: state.status == FormzStatus.submissionInProgress ? null : () {
context.read<RegisterCubit>().onSubmission();
onPressed: () {
if(
state.status == FormzStatus.valid ||
state.status == FormzStatus.submissionFailure
) {
context.read<RegisterCubit>().onSubmission();
}
},
child: state.status == FormzStatus.submissionInProgress ?
const SizedBox(