1- import 'package:disposebag/disposebag.dart' ;
1+ import 'dart:async' ;
2+
23import 'package:flutter/material.dart' ;
34import 'package:flutter_bloc_pattern/flutter_bloc_pattern.dart' ;
5+ import 'package:flutter_disposebag/flutter_disposebag.dart' ;
46import 'package:node_auth/pages/home/home.dart' ;
57import 'package:node_auth/pages/login/login.dart' ;
68import 'package:node_auth/pages/register/register.dart' ;
79import 'package:node_auth/pages/reset_password/reset_password_page.dart' ;
810import 'package:node_auth/utils/delay.dart' ;
911import 'package:node_auth/utils/snackbar.dart' ;
1012import 'package:node_auth/widgets/password_textfield.dart' ;
13+ import 'package:rxdart_ext/rxdart_ext.dart' ;
1114
1215class LoginPage extends StatefulWidget {
1316 static const routeName = '/login_page' ;
@@ -19,15 +22,13 @@ class LoginPage extends StatefulWidget {
1922}
2023
2124class _MyLoginPageState extends State <LoginPage >
22- with SingleTickerProviderStateMixin <LoginPage > {
23- final scaffoldKey = GlobalKey <ScaffoldState >();
24- DisposeBag disposeBag;
25-
25+ with SingleTickerProviderStateMixin <LoginPage >, DisposeBagMixin {
2626 AnimationController loginButtonController;
2727 Animation <double > buttonSqueezeAnimation;
28+ Object listen;
2829
29- FocusNode passwordFocusNode;
30- TextEditingController emailController;
30+ final passwordFocusNode = FocusNode () ;
31+ final emailController = TextEditingController () ;
3132
3233 @override
3334 void initState () {
@@ -49,45 +50,38 @@ class _MyLoginPageState extends State<LoginPage>
4950 ),
5051 ),
5152 );
52-
53- passwordFocusNode = FocusNode ();
54- emailController = TextEditingController ();
5553 }
5654
5755 @override
5856 void didChangeDependencies () {
5957 super .didChangeDependencies ();
6058
61- disposeBag ?? = () {
62- final loginBloc = BlocProvider .of <LoginBloc >(context);
63- return DisposeBag ([
64- loginBloc.message$.listen (handleMessage),
65- loginBloc.isLoading$.listen ((isLoading) {
66- if (isLoading) {
67- loginButtonController
68- ..reset ()
69- ..forward ();
70- } else {
71- loginButtonController.reverse ();
72- }
73- })
74- ]);
75- }();
59+ listen ?? = [
60+ context.bloc <LoginBloc >().message$.flatMap (handleMessage).collect (),
61+ context.bloc <LoginBloc >().isLoading$.listen ((isLoading) {
62+ if (isLoading) {
63+ loginButtonController
64+ ..reset ()
65+ ..forward ();
66+ } else {
67+ loginButtonController.reverse ();
68+ }
69+ })
70+ ].disposedBy (bag);
7671 }
7772
7873 @override
7974 void dispose () {
80- loginButtonController.dispose ();
81- disposeBag.dispose ();
8275 super .dispose ();
76+ passwordFocusNode.dispose ();
77+ loginButtonController.dispose ();
8378 }
8479
8580 @override
8681 Widget build (BuildContext context) {
8782 final loginBloc = BlocProvider .of <LoginBloc >(context);
8883
8984 return Scaffold (
90- key: scaffoldKey,
9185 body: Container (
9286 decoration: BoxDecoration (
9387 image: DecorationImage (
@@ -148,17 +142,19 @@ class _MyLoginPageState extends State<LoginPage>
148142 );
149143 }
150144
151- void handleMessage (message) async {
145+ Stream < void > handleMessage (message) async * {
152146 if (message is LoginSuccessMessage ) {
153- scaffoldKey .showSnackBar ('Login successfully' );
147+ context .showSnackBar ('Login successfully' );
154148 await delay (1000 );
149+
150+ context.hideCurrentSnackBar ();
155151 await Navigator .of (context).pushReplacementNamed (HomePage .routeName);
156152 }
157153 if (message is LoginErrorMessage ) {
158- scaffoldKey .showSnackBar (message.message);
154+ context .showSnackBar (message.message);
159155 }
160156 if (message is InvalidInformationMessage ) {
161- scaffoldKey .showSnackBar ('Invalid information' );
157+ context .showSnackBar ('Invalid information' );
162158 }
163159 }
164160
@@ -255,6 +251,7 @@ class _MyLoginPageState extends State<LoginPage>
255251 Widget needAnAccount (LoginBloc loginBloc) {
256252 return FlatButton (
257253 onPressed: () async {
254+ context.hideCurrentSnackBar ();
258255 final email = await Navigator .pushNamed (
259256 context,
260257 RegisterPage .routeName,
@@ -280,6 +277,7 @@ class _MyLoginPageState extends State<LoginPage>
280277 Widget forgotPassword (LoginBloc loginBloc) {
281278 return FlatButton (
282279 onPressed: () async {
280+ context.hideCurrentSnackBar ();
283281 final email = await Navigator .pushNamed (
284282 context,
285283 ResetPasswordPage .routeName,
0 commit comments