Skip to content

Commit 8b132df

Browse files
Code restructure
1 parent 2711f13 commit 8b132df

9 files changed

+89
-118
lines changed

lib/main.dart

+50-45
Original file line numberDiff line numberDiff line change
@@ -24,57 +24,62 @@ class MyApp extends StatelessWidget {
2424
),
2525
home: BlocProvider(
2626
bloc: HomeBloc(),
27-
child: AdaptiveHomePage(),
27+
child: AdaptiveHome(),
2828
));
2929
}
3030
}
3131

32-
class AdaptiveHomePage extends StatelessWidget {
32+
class AdaptiveHome extends StatelessWidget {
3333
@override
3434
Widget build(BuildContext context) {
35-
bool isWiderScreen = context.isWiderScreen();
36-
HomeBloc homeBloc = BlocProvider.of(context);
37-
return isWiderScreen
38-
? Row(
39-
children: [
40-
Expanded(
41-
child: StreamBuilder<SCREEN>(
42-
stream: homeBloc.screens,
43-
builder: (context, snapshot) {
44-
return SideDrawer();
45-
}),
46-
flex: 2,
47-
),
48-
SizedBox(
49-
width: 0.5,
50-
),
51-
Expanded(
52-
child: StreamBuilder<SCREEN>(
53-
stream: homeBloc.screens,
54-
builder: (context, snapshot) {
55-
if (snapshot.data != null) {
56-
// ignore: missing_enum_constant_in_switch
57-
switch (snapshot.data) {
58-
case SCREEN.ABOUT:
59-
return AboutUsScreen();
60-
case SCREEN.ADD_TASK:
61-
return AddTaskProvider();
62-
case SCREEN.COMPLETED_TASK:
63-
return TaskCompletedPage();
64-
case SCREEN.ADD_PROJECT:
65-
return AddProjectPage();
66-
case SCREEN.ADD_LABEL:
67-
return AddLabelPage();
68-
case SCREEN.HOME:
69-
return HomePage();
70-
}
71-
}
35+
return context.isWiderScreen() ? WiderHomePage() : HomePage();
36+
}
37+
}
38+
39+
class WiderHomePage extends StatelessWidget {
40+
@override
41+
Widget build(BuildContext context) {
42+
final homeBloc = context.bloc<HomeBloc>();
43+
return Row(
44+
children: [
45+
Expanded(
46+
child: StreamBuilder<SCREEN>(
47+
stream: homeBloc.screens,
48+
builder: (context, snapshot) {
49+
//Refresh side drawer whenever screen is updated
50+
return SideDrawer();
51+
}),
52+
flex: 2,
53+
),
54+
SizedBox(
55+
width: 0.5,
56+
),
57+
Expanded(
58+
child: StreamBuilder<SCREEN>(
59+
stream: homeBloc.screens,
60+
builder: (context, snapshot) {
61+
if (snapshot.data != null) {
62+
// ignore: missing_enum_constant_in_switch
63+
switch (snapshot.data) {
64+
case SCREEN.ABOUT:
65+
return AboutUsScreen();
66+
case SCREEN.ADD_TASK:
67+
return AddTaskProvider();
68+
case SCREEN.COMPLETED_TASK:
69+
return TaskCompletedPage();
70+
case SCREEN.ADD_PROJECT:
71+
return AddProjectPage();
72+
case SCREEN.ADD_LABEL:
73+
return AddLabelPage();
74+
case SCREEN.HOME:
7275
return HomePage();
73-
}),
74-
flex: 5,
75-
)
76-
],
77-
)
78-
: HomePage();
76+
}
77+
}
78+
return HomePage();
79+
}),
80+
flex: 5,
81+
)
82+
],
83+
);
7984
}
8085
}

lib/pages/home/home.dart

+12-27
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ class HomePage extends StatelessWidget {
1818

1919
@override
2020
Widget build(BuildContext context) {
21-
bool isDesktop = context.isWiderScreen();
22-
final HomeBloc homeBloc = BlocProvider.of(context);
21+
final bool isWiderScreen = context.isWiderScreen();
22+
final homeBloc = context.bloc<HomeBloc>();
2323
scheduleMicrotask(() {
2424
StreamSubscription? _filterSubscription;
2525
_filterSubscription = homeBloc.filter.listen((filter) {
@@ -40,7 +40,7 @@ class HomePage extends StatelessWidget {
4040
);
4141
}),
4242
actions: <Widget>[buildPopupMenu(context)],
43-
leading: isDesktop
43+
leading: isWiderScreen
4444
? null
4545
: new IconButton(
4646
icon: new Icon(
@@ -58,18 +58,11 @@ class HomePage extends StatelessWidget {
5858
),
5959
backgroundColor: Colors.orange,
6060
onPressed: () async {
61-
if (context.isWiderScreen()) {
62-
homeBloc.updateScreen(SCREEN.ADD_TASK);
63-
} else {
64-
await Navigator.push(
65-
context,
66-
MaterialPageRoute<bool>(builder: (context) => AddTaskProvider()),
67-
);
68-
_taskBloc.refresh();
69-
}
61+
await context.adaptiveNavigate(SCREEN.ADD_TASK, AddTaskProvider());
62+
_taskBloc.refresh();
7063
},
7164
),
72-
drawer: isDesktop ? null : SideDrawer(),
65+
drawer: isWiderScreen ? null : SideDrawer(),
7366
body: BlocProvider(
7467
bloc: _taskBloc,
7568
child: TasksPage(),
@@ -85,24 +78,16 @@ class HomePage extends StatelessWidget {
8578
key: ValueKey(CompletedTaskPageKeys.POPUP_ACTION),
8679
onSelected: (MenuItem result) async {
8780
switch (result) {
88-
case MenuItem.taskCompleted:
89-
if (context.isWiderScreen()) {
90-
var homeBloc = BlocProvider.of<HomeBloc>(context);
91-
homeBloc.updateScreen(SCREEN.COMPLETED_TASK);
92-
} else {
93-
await Navigator.push(
94-
context,
95-
MaterialPageRoute<bool>(
96-
builder: (context) => TaskCompletedPage()),
97-
);
98-
_taskBloc.refresh();
99-
}
81+
case MenuItem.TASK_COMPLETED:
82+
await context.adaptiveNavigate(
83+
SCREEN.COMPLETED_TASK, TaskCompletedPage());
84+
_taskBloc.refresh();
10085
break;
10186
}
10287
},
10388
itemBuilder: (BuildContext context) => <PopupMenuEntry<MenuItem>>[
10489
const PopupMenuItem<MenuItem>(
105-
value: MenuItem.taskCompleted,
90+
value: MenuItem.TASK_COMPLETED,
10691
child: const Text(
10792
'Completed Tasks',
10893
key: ValueKey(CompletedTaskPageKeys.COMPLETED_TASKS),
@@ -114,4 +99,4 @@ class HomePage extends StatelessWidget {
11499
}
115100

116101
// This is the type used by the popup menu below.
117-
enum MenuItem { taskCompleted }
102+
enum MenuItem { TASK_COMPLETED }

lib/pages/home/side_drawer.dart

+3-11
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import 'package:flutter_app/utils/keys.dart';
1414
import 'package:flutter_app/utils/extension.dart';
1515

1616
class SideDrawer extends StatelessWidget {
17-
1817
@override
1918
Widget build(BuildContext context) {
2019
HomeBloc homeBloc = BlocProvider.of(context);
@@ -32,16 +31,9 @@ class SideDrawer extends StatelessWidget {
3231
color: Colors.white,
3332
size: 36.0,
3433
),
35-
onPressed: () {
36-
if (context.isWiderScreen()) {
37-
homeBloc.updateScreen(SCREEN.ABOUT);
38-
} else {
39-
Navigator.push(
40-
context,
41-
MaterialPageRoute<bool>(
42-
builder: (context) => AboutUsScreen()),
43-
);
44-
}
34+
onPressed: () async {
35+
await context.adaptiveNavigate(
36+
SCREEN.ABOUT, AboutUsScreen());
4537
})
4638
],
4739
currentAccountPicture: CircleAvatar(

lib/pages/labels/add_label.dart

+1-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ class AddLabel extends StatelessWidget {
2727
} else {
2828
context.safePop();
2929
if (context.isWiderScreen()) {
30-
HomeBloc _homeBloc = BlocProvider.of<HomeBloc>(context);
31-
_homeBloc.updateScreen(SCREEN.HOME);
30+
context.bloc<HomeBloc>().updateScreen(SCREEN.HOME);
3231
}
3332
}
3433
});

lib/pages/labels/label_widget.dart

+3-14
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class LabelExpansionTileWidget extends StatelessWidget {
4646
}
4747

4848
List<Widget> buildLabels(BuildContext context) {
49-
LabelBloc _labelBloc = BlocProvider.of(context);
49+
final _labelBloc = context.bloc<LabelBloc>();
5050
List<Widget> projectWidgetList = [];
5151
_labels.forEach((label) => projectWidgetList.add(LabelRow(label)));
5252
projectWidgetList.add(ListTile(
@@ -56,18 +56,7 @@ class LabelExpansionTileWidget extends StatelessWidget {
5656
key: ValueKey(SideDrawerKeys.ADD_LABEL),
5757
),
5858
onTap: () async {
59-
if (context.isWiderScreen()) {
60-
final homeBloc = BlocProvider.of<HomeBloc>(context);
61-
homeBloc.updateScreen(SCREEN.ADD_LABEL);
62-
} else {
63-
context.safePop();
64-
await Navigator.push(
65-
context,
66-
MaterialPageRoute<bool>(
67-
builder: (context) => AddLabelPage(),
68-
),
69-
);
70-
}
59+
await context.adaptiveNavigate(SCREEN.ADD_LABEL, AddLabelPage());
7160
_labelBloc.refresh();
7261
}));
7362
return projectWidgetList;
@@ -81,7 +70,7 @@ class LabelRow extends StatelessWidget {
8170

8271
@override
8372
Widget build(BuildContext context) {
84-
HomeBloc homeBloc = BlocProvider.of(context);
73+
final homeBloc = context.bloc<HomeBloc>();
8574
return ListTile(
8675
key: ValueKey("tile_${label.name}_${label.id}"),
8776
onTap: () {

lib/pages/projects/add_project.dart

+1-2
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ class AddProject extends StatelessWidget {
3939
currentSelectedPalette.colorName);
4040
_projectBloc.createProject(project);
4141
if (context.isWiderScreen()) {
42-
HomeBloc _homeBloc = BlocProvider.of<HomeBloc>(context);
43-
_homeBloc.updateScreen(SCREEN.HOME);
42+
context.bloc<HomeBloc>().updateScreen(SCREEN.HOME);
4443
}
4544
context.safePop();
4645
_projectBloc.refresh();

lib/pages/projects/project_widget.dart

+2-14
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ class ProjectPage extends StatelessWidget {
1515
@override
1616
Widget build(BuildContext context) {
1717
ProjectBloc projectBloc = BlocProvider.of<ProjectBloc>(context);
18-
scheduleMicrotask(() => projectBloc.refresh());
1918
return StreamBuilder<List<Project>>(
2019
stream: projectBloc.projects,
2120
builder: (context, snapshot) {
@@ -55,19 +54,8 @@ class ProjectExpansionTileWidget extends StatelessWidget {
5554
leading: Icon(Icons.add),
5655
title: Text("Add Project"),
5756
onTap: () async {
58-
ProjectBloc projectBloc = BlocProvider.of<ProjectBloc>(context);
59-
if (context.isWiderScreen()) {
60-
final homeBloc = BlocProvider.of<HomeBloc>(context);
61-
homeBloc.updateScreen(SCREEN.ADD_PROJECT);
62-
} else {
63-
context.safePop();
64-
await Navigator.push(
65-
context,
66-
MaterialPageRoute<bool>(
67-
builder: (context) => AddProjectPage(),
68-
));
69-
}
70-
projectBloc.refresh();
57+
await context.adaptiveNavigate(SCREEN.ADD_PROJECT, AddProjectPage());
58+
context.bloc<ProjectBloc>().refresh();
7159
},
7260
));
7361
return projectWidgetList;

lib/pages/tasks/add_task.dart

+2-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ class AddTaskScreen extends StatelessWidget {
127127
_formState.currentState!.save();
128128
createTaskBloc.createTask().listen((value) {
129129
if (context.isWiderScreen()) {
130-
BlocProvider.of<HomeBloc>(context)
130+
context
131+
.bloc<HomeBloc>()
131132
.applyFilter("Today", Filter.byToday());
132133
} else {
133134
context.safePop();

lib/utils/extension.dart

+15-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:flutter/material.dart';
12
import 'package:flutter/widgets.dart';
23
import 'package:flutter_app/bloc/bloc_provider.dart';
34
import 'package:flutter_app/pages/home/home_bloc.dart';
@@ -12,10 +13,22 @@ extension NavigatorExt on BuildContext {
1213
bool isWiderScreen() {
1314
return MediaQuery.of(this).size.width > 600;
1415
}
16+
17+
adaptiveNavigate(SCREEN screen, Widget widget) async {
18+
final homeBloc = bloc<HomeBloc>();
19+
if (isWiderScreen()) {
20+
homeBloc.updateScreen(screen);
21+
} else {
22+
await Navigator.push(
23+
this,
24+
MaterialPageRoute<bool>(builder: (context) => widget),
25+
);
26+
}
27+
}
1528
}
1629

1730
extension BlocExt on BuildContext {
18-
T bloc<T>() {
19-
return BlocProvider.of(this) as T;
31+
T bloc<T extends BlocBase>() {
32+
return BlocProvider.of(this);
2033
}
2134
}

0 commit comments

Comments
 (0)