Skip to content

Commit 179769a

Browse files
committed
up
1 parent aef439c commit 179769a

File tree

12 files changed

+150
-149
lines changed

12 files changed

+150
-149
lines changed

analysis_options.yaml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
include: package:pedantic/analysis_options.1.9.0.yaml
2-
analyzer:
3-
exclude:
4-
- "lib/src/generated/*.dart"
5-
- "lib/generated/*.dart"
62
linter:
73
rules:
84
- prefer_final_locals

lib/app.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ class MyApp extends StatelessWidget {
6868
brightness: Brightness.dark,
6969
accentColor: const Color(0xFF00e676),
7070
),
71-
initialRoute: '/',
7271
routes: routes,
7372
),
7473
);

lib/main.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@ import 'package:rx_shared_preferences/rx_shared_preferences.dart';
1313

1414
void main() async {
1515
WidgetsFlutterBinding.ensureInitialized();
16-
DisposeBag.logger = null;
16+
// DisposeBag.logger = null;
1717

1818
await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
1919

2020
// construct RemoteDataSource
2121
const RemoteDataSource remoteDataSource = ApiService();
2222

2323
// construct LocalDataSource
24-
RxSharedPreferencesConfigs.logger = null;
24+
// RxSharedPreferencesConfigs.logger = null;
2525
final rxPrefs = RxSharedPreferences.getInstance();
2626
final LocalDataSource localDataSource = SharedPrefUtil(rxPrefs);
2727

lib/pages/home/change_password/change_password_bottomsheet.dart

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ class _ChangePasswordBottomSheetState extends State<ChangePasswordBottomSheet>
1818
AnimationController fadeMessageController;
1919
Animation<double> messageOpacity;
2020

21-
StreamSubscription subscription;
22-
FocusNode newPasswordFocusNode;
21+
StreamSubscription<void> subscription;
22+
final newPasswordFocusNode = FocusNode();
2323

2424
@override
2525
void initState() {
@@ -38,8 +38,6 @@ class _ChangePasswordBottomSheetState extends State<ChangePasswordBottomSheet>
3838
curve: Curves.bounceIn,
3939
),
4040
);
41-
42-
newPasswordFocusNode = FocusNode();
4341
}
4442

4543
@override
@@ -50,21 +48,24 @@ class _ChangePasswordBottomSheetState extends State<ChangePasswordBottomSheet>
5048
.changePasswordState$
5149
.listen((state) async {
5250
if (state.message != null) {
51+
final navigatorState = Navigator.of(context);
52+
5353
fadeMessageController.reset();
5454
await fadeMessageController.forward();
5555

5656
if (state?.error == null) {
57-
Navigator.of(context).pop();
57+
navigatorState.pop();
5858
}
5959
}
6060
});
6161
}
6262

6363
@override
6464
void dispose() {
65+
super.dispose();
6566
subscription.cancel();
6667
fadeMessageController.dispose();
67-
super.dispose();
68+
newPasswordFocusNode.dispose();
6869
}
6970

7071
@override

lib/pages/home/home_page.dart

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'dart:async';
22

33
import 'package:flutter/material.dart';
44
import 'package:flutter_bloc_pattern/flutter_bloc_pattern.dart';
5+
import 'package:flutter_disposebag/flutter_disposebag.dart';
56
import 'package:flutter_provider/flutter_provider.dart';
67
import 'package:node_auth/domain/usecases/change_password_use_case.dart';
78
import 'package:node_auth/pages/home/change_password/change_password.dart';
@@ -10,6 +11,7 @@ import 'package:node_auth/pages/home/home_profile_widget.dart';
1011
import 'package:node_auth/pages/login/login.dart';
1112
import 'package:node_auth/utils/delay.dart';
1213
import 'package:node_auth/utils/snackbar.dart';
14+
import 'package:rxdart_ext/rxdart_ext.dart';
1315

1416
class HomePage extends StatefulWidget {
1517
static const routeName = '/home_page';
@@ -21,11 +23,9 @@ class HomePage extends StatefulWidget {
2123
}
2224

2325
class _HomePageState extends State<HomePage>
24-
with SingleTickerProviderStateMixin<HomePage> {
25-
final scaffoldKey = GlobalKey<ScaffoldState>();
26+
with SingleTickerProviderStateMixin<HomePage>, DisposeBagMixin {
2627
AnimationController rotateLogoController;
27-
28-
StreamSubscription subscription;
28+
Object listen;
2929

3030
@override
3131
void initState() {
@@ -41,14 +41,16 @@ class _HomePageState extends State<HomePage>
4141
void didChangeDependencies() {
4242
super.didChangeDependencies();
4343

44-
subscription ??=
45-
BlocProvider.of<HomeBloc>(context).message$.listen(handleMessage);
44+
listen ??= BlocProvider.of<HomeBloc>(context)
45+
.message$
46+
.flatMap(handleMessage)
47+
.collect()
48+
.disposedBy(bag);
4649
}
4750

4851
@override
4952
void dispose() {
5053
rotateLogoController.dispose();
51-
subscription.cancel();
5254
super.dispose();
5355
}
5456

@@ -58,7 +60,6 @@ class _HomePageState extends State<HomePage>
5860
final logoSize = MediaQuery.of(context).size.width / 2;
5961

6062
return Scaffold(
61-
key: scaffoldKey,
6263
appBar: AppBar(
6364
title: Text('Home'),
6465
),
@@ -127,28 +128,30 @@ class _HomePageState extends State<HomePage>
127128
);
128129
}
129130

130-
void handleMessage(HomeMessage message) async {
131+
Stream<void> handleMessage(HomeMessage message) async* {
131132
print('[DEBUG] homeBloc message=$message');
132133

133134
if (message is LogoutMessage) {
134135
if (message is LogoutSuccessMessage) {
135-
scaffoldKey.showSnackBar('Logout successfully!');
136+
context.showSnackBar('Logout successfully!');
136137
await delay(1000);
138+
139+
context.hideCurrentSnackBar();
137140
await Navigator.of(context).pushNamedAndRemoveUntil(
138141
LoginPage.routeName,
139142
(_) => false,
140143
);
141144
}
142145
if (message is LogoutErrorMessage) {
143-
scaffoldKey.showSnackBar('Error when logout: ${message.message}');
146+
context.showSnackBar('Error when logout: ${message.message}');
144147
}
145148
}
146149
if (message is UpdateAvatarMessage) {
147150
if (message is UpdateAvatarSuccessMessage) {
148-
scaffoldKey.showSnackBar('Upload image successfully!');
151+
context.showSnackBar('Upload image successfully!');
149152
}
150153
if (message is UpdateAvatarErrorMessage) {
151-
scaffoldKey.showSnackBar('Error when upload image: ${message.message}');
154+
context.showSnackBar('Error when upload image: ${message.message}');
152155
}
153156
}
154157
}

lib/pages/login/login_page.dart

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
1-
import 'package:disposebag/disposebag.dart';
1+
import 'dart:async';
2+
23
import 'package:flutter/material.dart';
34
import 'package:flutter_bloc_pattern/flutter_bloc_pattern.dart';
5+
import 'package:flutter_disposebag/flutter_disposebag.dart';
46
import 'package:node_auth/pages/home/home.dart';
57
import 'package:node_auth/pages/login/login.dart';
68
import 'package:node_auth/pages/register/register.dart';
79
import 'package:node_auth/pages/reset_password/reset_password_page.dart';
810
import 'package:node_auth/utils/delay.dart';
911
import 'package:node_auth/utils/snackbar.dart';
1012
import 'package:node_auth/widgets/password_textfield.dart';
13+
import 'package:rxdart_ext/rxdart_ext.dart';
1114

1215
class LoginPage extends StatefulWidget {
1316
static const routeName = '/login_page';
@@ -19,15 +22,13 @@ class LoginPage extends StatefulWidget {
1922
}
2023

2124
class _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

Comments
 (0)